如何在PyQt4中从一个类访问变量到另一个类?

时间:2015-01-22 18:51:53

标签: python pyqt4

我想从主窗口中获取一个字符串,以便在通过单击触发的窗口中使用。我知道如何通过将所有语句放入一个类来实现它,但现在我尝试用每个窗口一个类来做同样的事情。这是代码:

import sys
from PyQt4 import QtGui

class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.value = QtGui.QLineEdit('23')
        self.button = QtGui.QPushButton('Open Dialog')
        self.button.clicked.connect(self.openDialog)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.value)
        vbox.addWidget(self.button)
        self.setLayout(vbox)

    def openDialog(self):
        self.entry = self.value.text()
        print(self.entry)
        Dialog().exec_()

class Dialog(QtGui.QDialog):
    def __init__(self, parent=Window):
        super().__init__()

        win = Window()
        self.text = win.entry
        self.label = QtGui.QLabel(self.text)

        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(self.label)
        self.setLayout(hbox)


def main():
    app = QtGui.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

但是我收到了错误" AttributeError:' Window'对象没有属性'条目' "而我也不知道如何尝试修复它。有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

Dialog方法中创建openDialog的实例,以便您可以直接访问其属性。这样,这两个类可以更独立地运行,您不需要从Window类中访问Dialog类:

    def openDialog(self):
        dialog = Dialog(self)
        dialog.label.setText(self.value.text())
        dialog.exec_()
        print(dialog.label.text())

class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.label = QtGui.QLabel(self)
        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(self.label)
        self.setLayout(hbox)

答案 1 :(得分:1)

下面

win = Window()
self.text = win.entry

您声明一个新窗口并访问其entry字段,但在您的窗口类

class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

未构建输入​​字段。

所以

  1. 您要创建一个新窗口,因此必须将self.entry放在构造函数上
  2. 您想在调用openDialog
  3. 后使用现有窗口访问其entry

    编辑:

    也许在这里

    class Dialog(QtGui.QDialog):
        def __init__(self, parent=Window):
            super().__init__()
    

    你正在错误地初始化这个类。应该使用parent = Window调用父构造函数。然后,从对话框内部,您可以通过执行self.parent

    来引用窗口