我有一个小部件,我需要重新创建。我在下面做了一个大大简化的例子。在这个例子中,我想用新的属性重新创建小部件。我知道在这个例子中我可以使用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重置技术时,它可以正常工作。以下是修改后的工作函数(而不是再次丢弃整个代码)
在代码中,当您单击按钮时,执行的操作与此相同:
这将创建新标签,并重新初始化UI(重复信号连接、创建小部件、设置布局等)。在
如果要重新创建标签而不是设置其文本,则不应重新初始化UI。相反,您应该从布局中删除重新创建的项,然后重新添加它们。示例:
^{pr2}$如果你想重新创建整个小部件,你应该清除它的所有布局项,或者用一个新的空的来替换这个布局,如本文所述,sopost replacing layout on a QWidget with another layout(你不能多次调用
setLayout()
,但可以传输布局!)。在您的示例失败了,因为如果
QMainWindow
已有布局,则无法对其进行设置。 如果在终端可见的情况下运行示例代码,则单击按钮时会看到下面打印的错误。在理论上,您应该能够删除旧的布局,并添加一个新的布局,但这在PyQt中似乎很困难。(编辑:关于如何删除和重新添加布局,请参阅Scholli的回答)
我建议您看看您是否真的需要重新创建整个布局,还是只需要替换布局中的一个小部件。如果你决定后者,有很多关于删除/替换布局中的小部件的stackoverflow帖子。在
相关问题 更多 >
编程相关推荐