访问 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的主要内容,如果未能解决你的问题,请参考以下文章
如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow