将窗户带到前面 - > raise(),show(),activateWindow()不起作用

时间:2011-05-22 12:22:27

标签: c++ windows winapi qt foreground

在我的Qt应用程序中,我在默认浏览器中打开一个URL。 之后我想把我的应用程序的主窗口再次放到前面。

我尝试了所有可以找到的方法,但都没有效果。所有这一切都在任务栏中闪烁(Window 7) 这是一个例子:

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

* viewer是指向QmlApplicationViewer的指针,该QmlApplicationViewer派生自QDeclarativeView

6 个答案:

答案 0 :(得分:25)

试试这个:

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

它在我的项目中工作(在我的项目查看器中是QMainWindow):https://github.com/iptton/Rythem

答案 1 :(得分:4)

此问题特定于Windows。 如果活动窗口属于某个进程,则Windows不允许其他进程更改活动窗口。

(不要尝试以下方法: https://wiki.qt.io/Qt_project_org_faq#QWidget_::activateWindow.28.29_-_behavior_under_windows

答案 2 :(得分:3)

我是这样做的:

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

假设“ this”是您的QMainWindow。 像魅力一样工作。

答案 3 :(得分:2)

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上测试它,它可能会工作。

答案 4 :(得分:0)

此问题并非特定于Windows ....我在Linux上遇到同样的问题。我的解决方案是在打开()之前关闭()窗口。

答案 5 :(得分:0)

对于 Windows,我是用 WinAPI 完成的。您还需要知道窗口标题;

#include <windows.h>
const QString windowTitle = "Some title";

HWND hwnd = ::FindWindowA(NULL, windowTitle.toLocal8Bit());
if (hwnd != NULL) {
    if (::IsWindowVisible(hwnd)) {
        ::SwitchToThisWindow(hwnd, TRUE);
    }
}