Принудительно перевести QApplication с помощью QQmlApplicationEngine на передний план

Я пытаюсь заставить свое приложение оставаться на вершине всего, даже когда появляются другие процессы. Вот упрощенная версия моего main:

main.cpp

QApplication                        app{argc, argv};
QQmlApplicationEngine               engine;

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

return app.exec();

Мне нужно решение как для Windows, так и для Linux. Однако приоритет отдается первому, и, похоже, решения 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.


person Grégoire Borel    schedule 14.03.2017    source источник


Ответы (1)


Неважно, это было глупо просто:

setWindowFlags(Qt::WindowStaysOnTopHint) скрывает окно Qt

Поэтому я написал это в своем file.qml:

ApplicationWindow
{
    visibility: "FullScreen"
    flags: Qt.WindowStaysOnTopHint
}
person Grégoire Borel    schedule 14.03.2017