簡體   English   中英

將窗口放在前面 -> raise(),show(),activateWindow() 不起作用

[英]Bring window to front -> raise(),show(),activateWindow() don’t work

在我的 Qt 應用程序中,我在默認瀏覽器中打開了一個 URL。 之后我想再次將我的應用程序的主窗口放在前面。

我嘗試了我能找到的所有方法,但都沒有奏效。 它所做的只是在(Window 7 的)任務欄中閃爍,這是一個示例:

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

*viewer 是一個指向從 QDeclarativeView 派生的 QmlApplicationViewer 的指針

嘗試這個:

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

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

此問題特定於 Windows。 如果活動窗口屬於某個進程,則 Windows 不允許其他進程更改活動窗口。

(不要嘗試以下操作: https : //wiki.qt.io/Qt_project_org_faq#QWidget_ :: activateWindow.28.29 _-_ behavior_under_windows

我是這樣做的:

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

假設“ this ”是你的QMainWindow 像魅力一樣工作。

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 上測試過這個,但它可能會工作。

這個問題不是 Windows 特有的……我在 Linux 上也有同樣的問題。 我的解決方案是在我重新打開()之前關閉()窗口。

對於 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);
    }
}
 

以下是從論壇借來的,對我有用:

auto eFlags = viewer.windowFlags();
viewer.setWindowFlags(eFlags|Qt::WindowStaysOnTopHint);
viewer.show();
viewer.setWindowFlags(eFlags);
viewer.show();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM