如何从pyqt5中的另一个布局的另一个孩子访问一个布局的孩子



首先,请让我解释一下情况。

i有一个QVBoxLayout,其中包含两个QHBoxLayout,其中一个具有QLineEditQPushButton,另一个具有单个QLabel,当按钮按按钮时,应用QLineEdit的文本填充。就是这样。

我知道,如何处理buttonClicked事件,如何获得QEditText的值以及所有这些。

这里的主要问题是,如何在buttonClicked事件处理程序内访问QLabelQLineEdit实例,特别是当它们是独立 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_())

相关内容

  • 没有找到相关文章