PyQt:重新创建小部件

2024-10-01 11:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小部件,我需要重新创建。我在下面做了一个大大简化的例子。在这个例子中,我想用新的属性重新创建小部件。我知道在这个例子中我可以使用QtGui.QLabel.setText(),但是在实际的程序中我不能做同样的事情。在

示例如下:

from PyQt4 import QtGui
import sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super().__init__()
        self.initAttributes()
        self.initLabel()
        self.initUI()

    def initAttributes(self):
        self.text = 'initial text'

    def initLabel(self):
        self.label = QtGui.QLabel()
        self.label.setText(self.text)

    def changeText(self):
        self.text = 'different text'
        self.initLabel()
        self.initUI()

    def initUI(self):
        button = QtGui.QPushButton()
        button.clicked.connect(self.changeText)
        grid = QtGui.QGridLayout()
        grid.addWidget(self.label)
        grid.addWidget(button)
        self.setLayout(grid)
        self.show()


app = QtGui.QApplication(sys.argv)
window = MainWindow()
app.exec_()

我在这里要做的是创建一个具有一些初始属性的小部件,在本例中是一个带有文本'initial text'的标签。如前所述,我不是要更改属性,而是尝试用从属于窗口对象的属性中提取的新属性来重新创建对象。在

按钮背后的想法是当按下时,它会改变窗口的自我.text属性,并将尝试使用与之前相同的方法重新创建标签。在

结果应该是窗口被重新初始化,重新创建的标签将具有新的文本'different text'。然而,什么也没发生。在

编辑: 解决方案是不能对同一个小部件调用setLayout两次。当在scholli的链接答案中使用widget重置技术时,它可以正常工作。以下是修改后的工作函数(而不是再次丢弃整个代码)

^{pr2}$

Tags: textself属性部件defbutton标签label
2条回答

在代码中,当您单击按钮时,执行的操作与此相同:

def changeText(self):
    self.text = 'different text'
    self.label = QtGui.QLabel(self.text)
    self.initUI()

这将创建新标签,并重新初始化UI(重复信号连接、创建小部件、设置布局等)。在

如果要重新创建标签而不是设置其文本,则不应重新初始化UI。相反,您应该从布局中删除重新创建的项,然后重新添加它们。示例:

^{pr2}$

如果你想重新创建整个小部件,你应该清除它的所有布局项,或者用一个新的空的来替换这个布局,如本文所述,sopost replacing layout on a QWidget with another layout(你不能多次调用setLayout(),但可以传输布局!)。在

您的示例失败了,因为如果QMainWindow已有布局,则无法对其进行设置。 如果在终端可见的情况下运行示例代码,则单击按钮时会看到下面打印的错误。在

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout

理论上,您应该能够删除旧的布局,并添加一个新的布局,但这在PyQt中似乎很困难。(编辑:关于如何删除和重新添加布局,请参阅Scholli的回答)

我建议您看看您是否真的需要重新创建整个布局,还是只需要替换布局中的一个小部件。如果你决定后者,有很多关于删除/替换布局中的小部件的stackoverflow帖子。在

相关问题 更多 >