使用 QQmlApplicationEngine 强制 QApplication 处于前台

Posted

技术标签:

【中文标题】使用 QQmlApplicationEngine 强制 QApplication 处于前台【英文标题】:Force QApplication using QQmlApplicationEngine to be on foreground 【发布时间】:2017-03-14 14:59:56 【问题描述】:

我试图强制我的应用程序保持在所有内容之上,即使在其他进程弹出时也是如此。这是我的main 的简化版:

ma​​in.cpp

QApplication                        appargc, argv;
QQmlApplicationEngine               engine;

engine.load(QUrl"qrc:/file.qml");

return app.exec();

我需要WindowsLinux 的解决方案。但是优先级是前者,似乎没有Qt 解决方案。这是我尝试过的:

#ifdef _WIN32
    HWND hCurWnd = ::GetForegroundWindow();
    DWORD dwMyID = ::GetCurrentThreadId();
    DWORD dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
    ::AttachThreadInput(dwCurID, dwMyID, TRUE);
    ::SetWindowPos(hCurWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    ::SetWindowPos(hCurWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    bool ok = ::SetForegroundWindow(hCurWnd);
    LOG_INFO() << ok;
    ::AttachThreadInput(dwCurID, dwMyID, FALSE);
    ::SetFocus(hCurWnd);
    ::SetActiveWindow(hCurWnd);
#endif

ok 返回true 但它似乎不起作用。外部进程在启动后仍显示在应用程序的顶部。

加载的QML 文件的visibility 设置为FullScreen。它的类型是ApplicationWindow

【问题讨论】:

【参考方案1】:

没关系,这很简单:

setWindowFlags(Qt::WindowStaysOnTopHint) hides Qt Window

因此我在我的 file.qml 中写了这个:

ApplicationWindow

    visibility: "FullScreen"
    flags: Qt.WindowStaysOnTopHint

【讨论】:

以上是关于使用 QQmlApplicationEngine 强制 QApplication 处于前台的主要内容,如果未能解决你的问题,请参考以下文章

QQmlApplicationEngine 没有发出警告信号

QQmlApplicationEngine 列表索引超出范围问题

qml-main.cpp中的两种启动Qt Quick App模式

QT qml的入门使用

Qt 预期字符 ')' 错误

为 QML TreeView 创建模型