0

我有一个QSplitter有两个小部件,想替换其中一个:

import sys
from PySide2.QtWidgets import (QMainWindow, QApplication, 
    QVBoxLayout, QWidget, QSplitter, QTextEdit, QLabel)


class Example(QWidget):  
    def __init__(self):
        super().__init__()

        splitter = QSplitter()
        splitter.insertWidget(0, QLabel('test'))
        splitter.insertWidget(1, QTextEdit())

        print(splitter.count())  # prints 2
        splitter.replaceWidget(1, QLabel('something else'))
        print(splitter.count())  # prints 1

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(splitter)


if __name__ == "__main__":
    app = QApplication()

    main = Example()
    main.show()

    sys.exit(app.exec_())

我的理解replaceWidget是,它将用提供的小部件替换拆分器中索引 X 上的现有小部件。在上面的示例中,索引 0 上有 aQLabel('test')和索引 1 QTextEdit()

在尝试替换索引 1 上的小部件后,我希望它是QLabel('something else'). 但似乎索引 1 上的小部件只是从查看count()替换操作之前和之后的输出中删除。

任何人都可以看到这个问题吗?

4

1 回答 1

2

这似乎是由 PySide2 中的错误引起的。调用后计数应该是 2 replaceWidget(),但它是 1。

根据replaceWidget的文档,拆分器应该拥有新小部件的所有权并将其重新设置为父级。但是 PySide 似乎不知何故忘记了它——所以大概它只是被垃圾收集了。在 PyQt5 中运行的相同代码按预期工作,尽管插入的小部件仍然不会显示(因为重新父级总是会使小部件不可见)。解决这些问题的方法是确保小部件在将其插入拆分器之前具有父级,然后再调用show()它:

    label = QLabel('something else', self)

    print(splitter.count())
    splitter.replaceWidget(1, label)
    print(splitter.count())

    label.show()

这在 PySide2 (5.15.2) 和 PyQt5 (5.15.2) 中都适用于我。

于 2021-02-05T17:13:16.983 回答