【发布时间】:2014-04-12 15:29:41
【问题描述】:
我有一个需要重新创建的小部件。我在下面做了一个大大简化的例子。在示例中,我想使用新属性重新创建小部件。我知道在这个例子中我可以使用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' 的标签。如前所述,我并没有尝试更改属性,而是尝试使用从属于窗口对象的属性中获取的新属性来重新创建对象。
按钮背后的想法是,当按下时,它会将窗口的'self.text'属性更改为其他内容,并尝试使用与以前相同的方法重新创建标签, initLabel.
结果应该是窗口被重新初始化,重新创建的标签将有新的文本'different text'。但是,什么也没有发生。
编辑:
解决方案是不能为同一个小部件调用两次setLayout。在 Schollii 的链接答案中使用小部件重置技术时,它可以正常工作。以下是修改后的工作函数(而不是再次转储整个代码)
def changeText(self):
self.text = 'different text'
self.initLabel()
self.delLayout()
self.initUI()
def delLayout(self):
QtGui.QWidget().setLayout(self.layout())
【问题讨论】:
-
您能展示一下您是如何尝试重新创建它的吗?这样做有什么问题?
-
如果您查看代码,您会看到连接到按钮的函数调用了 initLabel 函数,该函数应该将 self.label 设置为空白 QLabel。如果你执行代码并按下按钮,什么都不会发生
-
预期结果应该是使用文本“不同文本”创建标签,因为这是调用 initLabel 时 self.text 的值
-
我看到您正在重新创建小部件中的所有内容,这是重新创建标签的要求还是要求,但您重新创建了其余部分以便您可以看到新标签?
-
是的,实际程序中的所有其他小部件都需要完全重新初始化
标签: python python-3.x pyqt pyqt4