void MainWindow::focusInsideDockWidget(QObject *dockWidget) { if (!dockWidget) return; // CX_LOG_CHANNEL_DEBUG("HELP_DB") << QString(" try mw::focus [%1](%2)") // .arg(dockWidget->objectName()) // .arg(dockWidget->metaObject()->className()); // focusing to docked widgets is required by the help system // Assume structure: QDockWidget->QScrollArea->QWidget, // as defined in MainWindow::addAsDockWidget() QDockWidget* dw = dynamic_cast<QDockWidget*>(dockWidget); if (!dw) return; if (dw->parent()!=this) // avoid events from other mainwindows return; QScrollArea* sa = dynamic_cast<QScrollArea*>(dw->widget()); if (!sa) return; if (!sa->widget()) return; // CX_LOG_CHANNEL_DEBUG("HELP_DB") << QString(" do mw::focus [%1](%2)") // .arg(sa->widget()->objectName()) // .arg(sa->widget()->metaObject()->className()); QTimer::singleShot(0, sa->widget(), SLOT(setFocus())); // avoid loops etc by send async event. }
void MainWindow::_addDockWidgets() { if(!_updatePending) return ; for(size_t ii = 0 ; ii < _dockWidgets.size() ; ii++) { QWidget* widget = _dockWidgets[ii] ; Q_ASSERT(widget) ; if (widget->parent() != 0) return; QDockWidget* dockWidget = qobject_cast<QDockWidget*>(widget); if(!dockWidget) { dockWidget = new QDockWidget(this); dockWidget->setWidget(widget); } Qt::DockWidgetArea area = Qt::LeftDockWidgetArea; // = 0x1 // area values are 0x1, 0x2, 0x4, 0x8 while(!dockWidget->isAreaAllowed(area) && area <= 0x8) area=(Qt::DockWidgetArea)((int)area<<1); if (!(area&Qt::AllDockWidgetAreas)) { qDebug("%s",tr("No usable DockArea found for %1, using left one.").arg( dockWidget->windowTitle()).toAscii().constData()); area = Qt::LeftDockWidgetArea; } QMainWindow::addDockWidget(area, dockWidget); Q_ASSERT(widget->parent() != 0); Q_ASSERT(dockWidget->parent() != 0); } _updatePending = false ; }