首页 > 解决方案 > 如何从另一个类调用 QMainWindow 组件?

问题描述

我需要QMainWindow从另一个类中调用 a 的对象,但我找不到让它工作的方法。这是问题的一个最小示例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

class Starter:
    def __init__(self):
        super(Starter, self).__init__()
        print("starter")
        MainWindow().show_label()

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("Start")
        self.show()

    def show_label(self):
        print("show")
        label = QLabel("Hallo")
        self.setCentralWidget(label)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    Starter()
    sys.exit(app.exec_())

窗口正常打开Starter class并被调用,打印“starter”,也show_label被调用,打印“show”,但标签没有出现在窗口中。这种方法有什么问题?

标签: pythonclasspyqt5qmainwindow

解决方案


首先,我建议您对类和实例是什么以及它们如何工作进行一些研究和研究。

然后另一个不能忽视的重要方面是垃圾收集,这就是 Python 如何确保在不再需要对象时不浪费内存。
这既适用于您在 Starter 中创建的 MainWindow 实例,也适用于Starter()代码末尾的实例本身。

最后,在您的Starter班级中,您没有使用MainWindow您正在考虑的实例(在脚本末尾创建的那个),而是另一个在__init__()Starter: 之外绝对没有任何参考的实例:一旦执行该行,该实例被删除。

考虑到上述方面,尝试以下修改并了解差异。

class Starter:
    def __init__(self):
        super(Starter, self).__init__()
        self.mainWindow = MainWindow()
        self.mainWindow.show_label()

# ...
if __name__ == '__main__':
    app = QApplication(sys.argv)
    starter = Starter()
    sys.exit(app.exec_())

推荐阅读