首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QLayout.replace不替换

QLayout.replace不替换
EN

Stack Overflow用户
提问于 2020-07-25 22:30:15
回答 1查看 390关注 0票数 1

每次单击按钮()(self.btn)时,我都有以下代码来替换a小部件(self.lbl):

代码语言:javascript
复制
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__这样的方法。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 22:55:03

当您替换布局中的小部件时,前面的小部件仍然存在。

来自replaceWidget()

小部件的父级

保持不变。

问题是,当从布局中删除一个小部件时,它仍然保留它的父部件(在您的例子中是Workshop实例),所以您仍然可以查看它。如果您为创建的每一个新的AlignCenter设置了对齐方式,这就更清楚了:如果您添加了一个新标签并调整了窗口的大小,那么前一个窗口将保持原来的位置:

代码语言:javascript
复制
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:垃圾收集器将在覆盖时立即删除该小部件

代码语言:javascript
复制
    self.lbl.setParent(None)

  • 通过调用deleteLater()删除小部件,这是将小部件调整为None时发生的情况,如果没有其他持久化引用,则获取垃圾收集:

代码语言:javascript
复制
    self.lbl.deleteLater()

对于您的内容,我建议您使用deleteLater(),因为调用setParent() (这是QObject的setParent的一个重新实现)实际上做了许多其他事情(最重要的是,检查焦点链并重置小部件的窗口标志),而且由于小部件无论如何都将被删除,所有这些事情实际上都是不必要的,而且不管怎么说,QObject的setParent(None)实现都会被调用。

您所面临的图形“故障”可能取决于底层的低级绘图功能,在某些情况下,它在MacOS上有一些(已知的)意外行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63094202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档