每次单击按钮()(self.btn)时,我都有以下代码来替换a小部件(self.lbl):
import sys
from PySide2.QtCore import Slot
from PySide2.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, \
QPushButton
class Workshop(QWidget):
def __init__(self):
super().__init__()
self.n = 0
self.btn = QPushButton('Push me')
self.lbl = QLabel(str(self.n))
self.main_layout = QVBoxLayout()
self.sub_layout = QVBoxLayout()
self.sub_layout.addWidget(self.lbl)
self.sub_layout.addWidget(self.btn)
self.main_layout.addLayout(self.sub_layout)
self.btn.clicked.connect(self.change_label)
self.setLayout(self.main_layout)
self.show()
@Slot()
def change_label(self):
new_label = QLabel(str(self.n + 1))
self.main_layout.replaceWidget(self.lbl, new_label)
self.n += 1
self.lbl = new_label
if __name__ == '__main__':
app = QApplication()
w = Workshop()
sys.exit(app.exec_())在初始化之后,对象w看起来如下所示:

当我点击“按我”按钮(self.btn)时,这个数字会按需要递增,但是初始的"0“仍然在背景中:

但是,其他数字并不在背景中,只有"0“才会保留。前面的例子是" 22“(在我单击22次"Push”后的结果):

注释:i知道,我可以使用setText方法实现我想要的结果,但是这段代码只是一个片段,我将对一个类进行调整,在这个类中,我将没有像setText__这样的方法。
谢谢!
发布于 2020-07-25 22:55:03
当您替换布局中的小部件时,前面的小部件仍然存在。
小部件的父级
保持不变。
问题是,当从布局中删除一个小部件时,它仍然保留它的父部件(在您的例子中是Workshop实例),所以您仍然可以查看它。如果您为创建的每一个新的AlignCenter设置了对齐方式,这就更清楚了:如果您添加了一个新标签并调整了窗口的大小,那么前一个窗口将保持原来的位置:
class Workshop(QWidget):
def __init__(self):
# ...
self.lbl = QLabel(str(self.n), alignment=QtCore.Qt.AlignCenter)
# ...
def change_label(self):
new_label = QLabel(str(self.n + 1), alignment=QtCore.Qt.AlignCenter)
# ...您有两种可能性,它们实际上非常相似:
将“已删除”小部件的父部件设置为self.lbl:垃圾收集器将在覆盖时立即删除该小部件
self.lbl.setParent(None)deleteLater()删除小部件,这是将小部件调整为None时发生的情况,如果没有其他持久化引用,则获取垃圾收集:。
self.lbl.deleteLater()对于您的内容,我建议您使用deleteLater(),因为调用setParent() (这是QObject的setParent的一个重新实现)实际上做了许多其他事情(最重要的是,检查焦点链并重置小部件的窗口标志),而且由于小部件无论如何都将被删除,所有这些事情实际上都是不必要的,而且不管怎么说,QObject的setParent(None)实现都会被调用。
您所面临的图形“故障”可能取决于底层的低级绘图功能,在某些情况下,它在MacOS上有一些(已知的)意外行为。
https://stackoverflow.com/questions/63094202
复制相似问题