質問: 現在QDockWidgetを利用した画面制御を考えているのですが、 アクティブとなったDockWidgetが取得できずに困っております。 開発環境: ・Windows10 ・VS2015 (C++) ・Qt5.10.0 やりたい事: MainWindow内に複数のDockWidgetが存在し、Floatingも許可している状態。 最後にアクティブにしたウィンドウに合わせてメニューやToolbarの状態を変化したい。 困っている事: DockWidgetがfloating中であれば、DockWidgetのアクティブ状態を取得すればなんとかなる事はわかりましたが、MainWindows内にドッキングしている状態(左右での2面表示等)の場合に、どれがアクティブなウィンドウかを取得する方法がわかりません。 可能であればfloating中のウィンドウも含めて、トップレベル(最後に触った)ウィンドウを取得する方法を知りたいです。 是非ご回答宜しくお願いいたします。
回答: こちらのQAはどうでしょうか? How to get active QDockWidget in QQMainWindow MainWindow クラスに以下のようなスロット関数を作成し、フォーカスが変更された際に呼ばれる QApplication::focusChanged シグナルと接続して確認したところ、現在アクティブになっている QDockWidget が取れることが確認できましたが、どうでしょうか? main.cpp 内 ``` QObject::connect( &app, &QApplication::focusChanged, &mainWin, &MainWindow::getCurrentFocus); ``` mainwindow.cpp 内 ``` void MainWindow::processFocusChange(QWidget *old, QWidget *now) { if (!now) return; // アプリケーションにフォーカスしていない場合 // 現在フォーカスがある QWdiget が DockWidget の子孫かどうか調べる。 QDockWidget *dock = nullptr; for (QObject *obj = now; obj; obj = obj->parent()) { if (dock = qobject_cast(obj)) break; } // 先祖が DockWidget の場合 if (dock) // DockWdiget の種類に応じて、なんらかの処理 qDebug() << dock->windowTitle(); } ```