带有标志的 PyQt5 MainWindow 立即超出范围

PyQt5 MainWindow with flag instantly goes out of scope

我使用 Qt Designer 创建了 UI。然后我将 ui 文件转换为 .py 文件 (pyuic -x) - 如果直接启动它工作正常。然后我尝试在一个单独的文件中子类化我的 ui 以实现额外的逻辑。这就是事情开始出错的地方。正如预期的那样,继承自 QMainWindow 和我的 Qt Designer 文件工作正常,没有任何问题。然而,当我为我的 QMainWindow 设置任何 WindowFlag(任何标志 - 我试过这些:StaysOnTop,FramelessWindowHint)和 运行 文件时,window 出现并立即消失。该程序在控制台 window 中继续 运行,或作为 PyCharm 进程,但 window 消失了。在我看来它超出了范围 - 但为什么设置一个简单的标志会对垃圾收集器产生任何影响?有人可以解释这种行为吗?

重现此现象所需的最低代码要求ui红色:

from ui import Ui_MainWindow
from PyQt5 import QtCore, QtWidgets, QtGui
import sys


class Logic(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setupUi(self)
        self.show()
        # self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        # self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground, True)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Logic()
    sys.exit(app.exec_())

window 应该出现并停留在屏幕上,直到一个(或多个)标志被取消注释。我在 PyQt5 中使用 Python 3.8(32 位)。 运行 环境由 PyCharm 提供。 Windows10.

来自documentation of setWindowFlags()

Note: This function calls setParent() when changing the flags for a window, causing the widget to be hidden. You must call show() to make the widget visible again..

所以,只需在设置标志后移动 self.show(),或者从 __init__ 外部调用它( 实例创建之后),这是最常见和推荐的方法,因为只有在实例化后才显示小部件被认为是一种很好的做法。