带有标志的 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__
外部调用它(在 实例创建之后),这是最常见和推荐的方法,因为只有在实例化后才显示小部件被认为是一种很好的做法。
我使用 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__
外部调用它(在 实例创建之后),这是最常见和推荐的方法,因为只有在实例化后才显示小部件被认为是一种很好的做法。