Windows 10上的PyQt 5.6.2 / 5.9.1-WindowStaysOnTopHint无法正常工作

时间:2018-08-11 17:28:59

标签: qt pyqt5 qwidget

PyQt 5.6.2、5.9.1,Anaconda,vscode,Windows 10 x64。

QtCore.Qt.WindowStaysOnTopHint中或通过super().__init__()设置self.setWindowFlags()无效。 对于Qt 4.8.7(PyQt 4.11.4),该标记可以正常工作。

我可以使用Windows API(HWND_TOPMOST标志)来解决此问题:

import sys
try:
    from PyQt5 import QtCore, QtWidgets
except ImportError:
    from PyQt4 import QtCore, QtGui as QtWidgets

class Form1(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.pushButton1 = QtWidgets.QPushButton("Push", self)
        self.pushButton1.clicked.connect(self.clicked)
        self.ontop = False

    def clicked(self):
        self.ontop = not self.ontop
        self.windowStaysOnTopHint(self.ontop)

    def windowStaysOnTopHint(self, b=True):
        try:
            import win32gui, win32con
            flag = win32con.HWND_TOPMOST if b else win32con.HWND_NOTOPMOST
            win32gui.SetWindowPos(self.winId(), flag, 0, 0, 0, 0, win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        except ModuleNotFoundError:
            pass
        if b:
            flag = self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint
        else:
            flag = self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint
        self.setGeometry(self.geometry())  # `setWindowFlags` resets size if setGeometry is never called
        self.setWindowFlags(flag)
        self.show()

print(QtCore.QT_VERSION_STR)
app = QtWidgets.QApplication(sys.argv)
form1 = Form1()
form1.show()
app.exec_()

我可以使用win32gui.SetWindowPos并完全删除setWindowFlags块。但是我真的很想知道这种行为的原因。

0 个答案:

没有答案