web-dev-qa-db-ja.com

ウィンドウを前面に移動-> raise()、show()、activateWindow()が機能しない

私のQtアプリケーションでは、default-browserでURL​​を開きます。その後、アプリケーションのメインウィンドウを再び前面に表示したいと思います。

私は見つけることができるすべてのアプローチを試しましたが、どれもうまくいきませんでした。 (ウィンドウ7の)タスクバーで点滅するだけです。例は次のとおりです。

this->viewer->show();
this->viewer->raise();
this->viewer->activateWindow();

* viewerはQDeclarativeViewから派生したQmlApplicationViewerへのポインターです

23
Hedge

この問題はWindowsに固有です。アクティブウィンドウが何らかのプロセスに属している場合、Windowsは他のプロセスがアクティブウィンドウを変更することを許可しません。

(以下を試さないでください: https://wiki.qt.io/Qt_project_org_faq#QWidget_::activateWindow.28.29_-_behavior_under_windows

4
Johan Råde

これを試して:

viewer.setWindowState( (windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
viewer.raise();  // for MacOS
viewer.activateWindow(); // for Windows

それは私のプロジェクトで動作します(私のプロジェクトビューアーではQMainWindowです): https://github.com/iptton/Rythem

27
iptton

私はそれをこのようにしました:

{
 this->show(); // Restore from systray
 this->setWindowState(Qt::WindowState::WindowActive); // Bring window to foreground
}

「これ」があなたのQMainWindowであると仮定します。魅力のように働いた。

2
Sunburst275
for ( QWindow* appWindow : qApplication.allWindows() )
{
  appWindow->show(); //bring window to top on OSX
  appWindow->raise(); //bring window from minimized state on OSX

  appWindow->requestActivate(); //bring window to front/unminimize on windows
}

これにより、OSXとWindowsの両方で他の仮想デスクトップからウィンドウが表示されることにも注意してください。私はこれをLinuxでテストしませんでしたが、うまくいくかもしれません。

2
agnu17

この問題はWindowsに固有のものではありません... Linuxでも同じ問題があります。私の解決策は、open()する前にウィンドウをclose()することでした。

2
Bruce Chidester