30

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

我尝试了所有我能找到的方法,但都没有奏效。它所做的只是在任务栏中闪烁(窗口 7)这是一个示例:

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

*viewer 是指向从 QDeclarativeView 派生的 QmlApplicationViewer 的指针

4

7 回答 7

34

试试这个:

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

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

于 2012-05-30T01:33:14.427 回答
8

我是这样做的:

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

假设 " this" 是你的QMainWindow. 像魅力一样工作。

于 2020-02-04T17:56:06.990 回答
7

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

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

于 2011-05-22T12:29:04.487 回答
3
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 上测试这个,但它可能工作。

于 2017-01-10T09:37:59.807 回答
2

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

于 2013-10-08T16:52:44.273 回答
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);
    }
}
 
于 2021-01-19T06:03:45.087 回答
0

以下是从论坛借来的,对我有用:

auto eFlags = viewer.windowFlags();
viewer.setWindowFlags(eFlags|Qt::WindowStaysOnTopHint);
viewer.show();
viewer.setWindowFlags(eFlags);
viewer.show();
于 2021-10-30T17:35:28.353 回答