切换 QMainWindow WindowStaysOnTopHint 标志 pyside

toggle QMainWindow WindowStaysOnTopHint flag pyside

为什么当我将 QMainWindow 的 SetWindowFlags 切换为 WindowStaysOnTopHint 时,我的 window 会消失,更重要的是不会停留在最前面?我正在使用 PySide 和 QMainWindow。

import sys
from PySide import QtGui, QtCore

class Browser(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Browser, self).__init__(parent)
        self.resize(200, 150)
        self.setWindowTitle('Assets')
        self.initUI()

    def initUI(self):

        self.mi_stay_on_top = QtGui.QAction('Stay On Top', self)
        self.mi_stay_on_top.setShortcut('Ctrl+T')
        self.mi_stay_on_top.setCheckable(True)
        self.mi_stay_on_top.triggered.connect(self.toggle_stay_on_top)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(self.mi_stay_on_top)

        grid = QtGui.QVBoxLayout()
        grid.setContentsMargins(10,10,10,10)
        self.setLayout(grid)

    def toggle_stay_on_top(self):
        if self.mi_stay_on_top.isChecked():
            # enabled
            self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        else:
            # disable
            self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Browser()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

setWindowFlags 方法重置父级,它隐藏了 window。

所以你需要这样做:

def toggle_stay_on_top(self):
    if self.mi_stay_on_top.isChecked():
        # enabled
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
    else:
        # disable
        self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
    # re-show the window after changing flags
    self.show()