我真的需要让自己的窗口保持在Windows上,但Windows本身似乎不愿意让我这样做。
我无法使用解决方法设置registry值,因为我无法要求用户注销/login。
此外,我使用QML和QWidget :: raise()和QApplication :: setActiveWindow()的解决scheme似乎也没有工作,因为我还没有设法得到QML根对象作为QWidget指针与下面的代码:
QWidget* mainWin = qobject_cast<QWidget*>(engine.rootObjects().at(0)); if (mainWin) { mainWin->raise(); QApplication::setActiveWindow(mainWin); mainWin->activateWindow(); }
我也试图使QML中的窗口处于活动状态:
window.raise() window.requestActivate()
但也没有运气。
有没有办法把窗口放在Windows上,而不用改变registry,最好是纯粹从QML开始?
编辑 :目前使用的窗口标志是:
Qt.Popup Qt.FramelessWindowHint Qt.WindowStaysOnTopHint Qt.CustomizeWindowHint Qt.BypassWindowManagerHint Qt.MSWindowsFixedSizeDialogHint
我正在Windows 10 x64机器上部署Qt 5.7应用程序 。 我发现了这两个错误修正:
从中我可以得出结论,QWidget :: activateWindow()和QWindow :: requestActive()应该在Windows XP和Windows 7上工作。
这是我的mcve ,正如@derM所问:
import QtQuick 2.7 import QtQuick.Window 2.2 Window { flags: Qt.WindowStaysOnTopHint width: 100 height: 100 visible: true }
它使用MinGW x32在Windows 10 x64下编译。
更简单的重现方法:在命令提示符下运行
timeout 5 && debug\Test.exe
其中debug \ Test.exe是mcve二进制文件的path,然后打开文件资源pipe理器并在某处导航。 当窗户打开时,它不会在前台。
更难的方法 :如果你只是运行它,窗口将保持在最佳状态。 但是如果你按下Qt Creator中的运行button,并切换焦点(我想,鼠标焦点应该改变,只需按Alt + Tab不会帮助)到另一个进程(在我的情况下 – 文件资源pipe理器),窗口显示在当前活动的文件资源pipe理器窗口下,即使我点击它,它也会在我select任何其他应用程序后立即启动。
真正的应用程序是从一个服务开始的,所以当我的应用程序启动时,经常会有一个应用程序保持鼠标焦点。 我想Qt能够将窗口设置为前景是通过使用SetForegroundWindow API调用实现的,该调用注意到以下限制:
所以我想知道,如果进程是由服务启动的,而不是用户(即进程在启动期间还没有活动的进程),那么是否有可能将窗口置于前台。
正如您所发布的:如果窗口是从前台进程创建的,那么我们将确保在创建窗口之前,我们的进程是前台进程。
import QtQuick 2.7 import QtQuick.Window 2.2 Item { id: root Component { // Like a splash screen: Claim to be foreground process, // then create main window. id: winInit Window { flags: Qt.WindowStaysOnTopHint width: 1 height: 1 Component.onCompleted: { requestActivate() mainWin.createObject(root) } } } Component { id: mainWin Window { flags: Qt.WindowStaysOnTopHint width: 100 height: 100 visible: true } } Component.onCompleted: { var w1 = winInit.createObject(null) w1.destroy() } }