gpt4 book ai didi

python - PyQt:重新创建小部件

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:27 24 4
gpt4 key购买 nike

我有一个小部件需要重新创建。我在下面做了一个大大简化的例子。在示例中,我想用新属性重新创建小部件。我知道在这个例子中我可以使用 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”属性更改为其他内容,并尝试使用与之前相同的方法重新创建标签, 初始化标签

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

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

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

def delLayout(self):
QtGui.QWidget().setLayout(self.layout())

最佳答案

在你的代码中,当你点击按钮时,你正在做同样的事情:

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

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

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

self.layout().removeWidget(self.label)
self.text = 'new text'
self.label = QtGui.QLabel(self.text)
self.layout().addWidget(self.label, 0, 0)

如果您想重新创建整个小部件,您应该清除其所有布局项目,或将布局替换为新的空布局,如 SO 帖子 replacing layout on a QWidget with another layout 中所述。 (您不能多次调用 setLayout(),但可以转移布局!)。

关于python - PyQt:重新创建小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23032362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com