访问 QMainWindow 类变量 - Pyside/PyQt

Posted

技术标签:

【中文标题】访问 QMainWindow 类变量 - Pyside/PyQt【英文标题】:Accessing QMainWindow class variables - Pyside/PyQt 【发布时间】:2013-11-25 22:48:52 【问题描述】:

我正在用 Python 编写一个 GUI 应用程序,它使用多个 .py 脚本。我在 QMainWindow 中有一个变量,我需要在其他类中引用/访问它。将各种 .py 模块导入 Ui_MainWindow.py 模块没有问题,但我似乎无法访问 QMainWindow 类变量。

这是我正在尝试的快速伪代码:

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        self.lineEditScanBarcode.returnPressed.connect(self.LoginAttempt)

    def LoginAttempt(self):
        self.user_barcode = self.lineEditScanBarcode.text()

根据我对类变量的阅读,我得出的结论是,通过上述设置,我应该能够引用其他类中的“user_barcode”变量,如下所示:

class Receipt(QWidget, Ui_Receipt):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setupUi(self)

        print(MainWindow.user_barcode)

我一直在使用“打印”命令来测试它是否有效,但我收到以下错误:

Attribute Error: type object 'MainWindow' has no attribute 'user_barcode'

谁能看到我明显犯的错误?我搜索了类似的查询,但没有找到任何相关的内容。

谢谢!

编辑:

这是 app.exec_() 设置,我不确定我是否正确传递了父级。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    showMainWindow = MainWindow()
    showReceipt = Receipt(MainWindow)
    showMainWindow.show()
    app.exec_()

我尝试了各种组合,但要么收到 init 错误,要么收到引发的 TypeError。

【问题讨论】:

【参考方案1】:

示例代码不起作用的原因是因为 MainWindow 是一个 ,而 user_barcode 是该类的一个 instance 的属性。

要让 Receipt 访问 user_barcode 属性,它必须以某种方式让 MainWindow 实例可供它使用。一种方法是将 MainWindow 设置为 Receipt 的父级。

这将允许 Receipt 使用parent method 访问 MainWindow 实例及其属性。当然,这意味着 Receipt 必须始终有一个 MainWindow 作为它的父窗口,所以它的构造函数应该看起来更像这样:

class Receipt(QWidget, Ui_Receipt):
    def __init__(self, parent):
        if not isinstance(parent, MainWindow):
            raise TypeError('parent must be a MainWindow')
        super(Receipt, self).__init__(parent)
        self.setupUi(self)
        ...
        print(self.parent().user_barcode)

【讨论】:

感谢那个 ekhumoro,这实际上更有意义。我已经修改了我的代码以包含您在上面发布的内容,现在我得到:TypeError:init() 缺少 1 个必需的位置参数:'parent'。当我第一次在 if name == 'main': 声明和 app.exec_() 设置下引用 Receipt 模块时,就会发生这种情况。有什么想法吗? 好吧,它告诉你需要传入一个“父级”:即 window = MainWindow();收据=收据(窗口) 我已尝试按照您的建议传递父级(请参阅上面的编辑),但它现在返回引发的 TypeError。再次感谢您的帮助,非常感谢! 正如我在回答中解释的那样,您需要传入一个实例,而不是类,即showReceipt = Receipt(showMainWindow)

以上是关于访问 QMainWindow 类变量 - Pyside/PyQt的主要内容,如果未能解决你的问题,请参考以下文章

漫谈QWidget及其派生类(三)

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

如何从另一个类调用 QMainWindow 组件?

从ABC和QMainWindow继承的抽象类[重复]

从 QMainWindow 调用具有变量名的 Python 函数

指针作为类变量 Qt