如何使用 Qt 将 Widget 替换为另一个?

Posted

技术标签:

【中文标题】如何使用 Qt 将 Widget 替换为另一个?【英文标题】:How to replace a Widget with another using Qt? 【发布时间】:2011-01-07 11:38:16 【问题描述】:

我有一个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)

但它不起作用,所有小部件都相互堆叠:

(来源:free.fr) .

你知道我怎样才能删除旧的小部件,然后再显示新的吗?

【问题讨论】:

【参考方案1】:

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

QStackedWidget 是一种预设布局的解决方案。它就像一个旧餐厅里的音乐盒中的轻浮物。 (点唱机中的专辑数量,翻阅已安装的专辑)。

但这并不能解决问题。

例如,我有代码正在使用 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() 方法中

干杯..希望这会有所帮助。 乙

【讨论】:

非常感谢你,终于找到了一个真正有效的解决方案【参考方案2】:

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

【讨论】:

很好,我会试一试。谢谢【参考方案3】:

实际上,至少对于 Qt5 来说,利用 QLayout 的replaceWidget 有一个比 B4adle7 的解决方案更紧凑的替代方案:

containing_layout = placeholder.parent().layout()
containing_layout.replaceWidget(placeholder, new_widget)

【讨论】:

是的!为我工作!尽可能快速和简单!

以上是关于如何使用 Qt 将 Widget 替换为另一个?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将特定的 RGB 颜色替换为另一个图像

如何使用 Ghostscript 将 PDF 中的页面替换为另一个页面?

如何在 unix 环境中使用 sed/awk/tr 将一个模式替换为另一个模式来保持其值?

如何将单个文件中的特定列重复替换为另一个文件的列?

Qt中怎样将widget 添加到mainwindow?

如何为一个qt widget做一个滚动条