首先,请让我解释一下情况。
i有一个QVBoxLayout
,其中包含两个QHBoxLayout
,其中一个具有QLineEdit
和QPushButton
,另一个具有单个QLabel
,当按钮按按钮时,应用QLineEdit
的文本填充。就是这样。
我知道,如何处理buttonClicked
事件,如何获得QEditText
的值以及所有这些。
这里的主要问题是,如何在buttonClicked
事件处理程序内访问QLabel
和QLineEdit
实例,特别是当它们是独立 BoxLayout的孩子时。
我已经通过将它们定义为类变量来解决此问题,因此可以从任何地方访问它们。但这显然不是一个好的设计。因此,我正在寻找一种解决这个特定问题的推荐方法。
我的代码:
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QHBoxLayout, QLabel, QWidget, QPushButton, QLineEdit
class Example(QWidget):
def __init__(self):
super().__init__()
self.setUI()
def setUI(self):
h1box = QHBoxLayout()
line_edit = QLineEdit()
button = QPushButton("Submit")
button.clicked.connect(self.buttonClicked)
h1box.addWidget(line_edit)
h1box.addWidget(button)
h2box = QHBoxLayout()
label = QLabel("0")
h2box.addWidget(label)
vbox = QVBoxLayout()
vbox.addLayout(h1box)
vbox.addLayout(h2box)
self.setLayout(vbox)
self.show()
def buttonClicked(self):
# label needs to be filled with LineEdit value
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
您似乎正在混淆术语类变量和实例变量。
。前者是班级的一个属性,并且有可能在班级的所有实例之间共享;而后者是该实例的属性,通常是每个实例所独有的。可以通过类对象本身直接访问类属性(这意味着通常在全局名称空间中可用);而必须通过特定实例访问实例属性(因此通常不可用)。
在PYQT/Pyside应用程序中,使用实例变量是完全正常且接受的实践。您将看到的几乎每个示例和教程都使用它们,这也是您应该用来解决自己当前问题的方法。
类变量最常用作全局常数。因此,例如在QT中,可以通过类访问许多枚举(例如QPalette.Background
)。如果您已经阅读了定义类变量是不良设计的,那么它可能是在将它们用作Global state变量 - 通常被认为是大多数编程语言的不良实践的上下文。
先生,有一百万种方法。我不知道您是否想要这种方式,但这是一个例子。
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QHBoxLayout, QLabel, QWidget, QPushButton, QLineEdit
class Example(QWidget):
line_edit = None
button = None
h1box = None
h2box = None
vbox = None
label = None
def __init__(self):
super().__init__()
self.setUI()
def setUI(self):
self.h1box = QHBoxLayout()
self.line_edit = QLineEdit()
self.button = QPushButton("Submit")
self.button.clicked.connect(self.buttonClicked)
self.h1box.addWidget(self.line_edit)
self.h1box.addWidget(self.button)
self.h2box = QHBoxLayout()
self.label = QLabel("0")
self.h2box.addWidget(self.label)
self.vbox = QVBoxLayout()
self.vbox.addLayout(self.h1box)
self.vbox.addLayout(self.h2box)
self.setLayout(self.vbox)
self.show()
def buttonClicked(self):
self.label.setText(self.line_edit.text())
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
exemp = Example()
exemp.showMaximized()
sys.exit(app.exec_())