如何使用Qt将一个小部件替换为另一个小部件?

2024-05-16 00:16:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个QHBoxLayout,左边有一个QTreeWidget,中间有一个分隔符,右边有一个小部件。

当我单击QTreeWidget时,我想更改右边的小部件来修改QTreeWidgetItem

我试着用这个代码:

def new_rendez_vous(self):
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget)
    del self.ui.editionFormWidget
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent)
    self.ui.editionFormWidget.show()
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget)
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData)

def edit(self, category, rendez_vous):
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget)
    del self.ui.editionFormWidget
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent, category, rendez_vous)
    self.ui.editionFormWidget.show()
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget)
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData)

def edit_category(self, category):
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget)
    del self.ui.editionFormWidget
    self.ui.editionFormWidget = CategoryManagerDialog(self.parent, category)
    self.ui.editionFormWidget.show()
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget)
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData)

但它不起作用,所有的小部件都堆叠在一起:

Exemple of the bug
(来源:free.fr
.

你知道我如何删除旧的小部件,然后再显示新的吗?


Tags: selfui部件defshowconnectparentdel
2条回答

我和纳蒂姆有同样的问题。

QStackedWidget是一个预设布局的解决方案。它的行为就像是在一个旧餐厅的音乐盒轻浮的东西。(X—光盘机中相册的数量,翻阅已安装的相册)。

然而,这并不能解决问题。

例如,我有一个使用UI布局进行原型设计的代码,但是我想用在主脚本执行期间编码的或动态创建的适当小部件替换一些充当占位符的小部件。

我确信对于如何正确地删除/替换小部件有一个简单的过程或警告。

我的代码在网格布局中有一个基本的textEdit小部件。我想为这个小部件的拖放编写一个自定义版本,然后用默认的textEdit将其替换掉。

与Natim一样,代码看起来逻辑上是合理的,但是小部件在布局上却像扔钱包一样乱七八糟地堆在一起。

希望能找出诀窍,并重新发布警告。

解决方案:

喂!!找到了一个绝对有用的东西。关闭小部件

#  Remove, Create, Replace
    self.ui.gridLayout.removeWidget(self.ui.dragDataEdit)
    self.ui.dragDataEdit.close()
    self.ui.dragDataEdit = myDumpBox(self.ui.centralwidget)
    self.ui.gridLayout.addWidget(self.ui.dragDataEdit, 0, 0, 1, 1)
    self.ui.gridLayout.update()

我从布局中删除了小部件,然后关闭了小部件。此时,我使用的变量将打开以创建自定义/修改的小部件,然后将其重新插入到布局中

是的,处理更复杂的布局需要更优雅一些,但是销毁小部件以替换它的基本需求是在.close()方法中

干杯。。希望这有帮助。 乙

最常见的解决方案是使用^{}并将所有可能的小部件放入堆栈中。选择项目时,只需调用setCurrentWidget即可显示所需的项目。

相关问题 更多 >