在我的Qt应用程序中,我在默认浏览器中打开一个URL。 之后我想把我的应用程序的主窗口再次放到前面。
我尝试了所有可以找到的方法,但都没有效果。所有这一切都在任务栏中闪烁(Window 7) 这是一个例子:
this->viewer->show();
this->viewer->raise();
this->viewer->activateWindow();
* viewer是指向QmlApplicationViewer的指针,该QmlApplicationViewer派生自QDeclarativeView
答案 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);
}
}