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

时间:2011-01-07 11:38:17

标签: python qt pyqt

我左边有一个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 http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg

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

3 个答案:

答案 0 :(得分:19)

我和Natim有同样的问题。

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()方法中

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

答案 1 :(得分:18)

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

答案 2 :(得分:5)

实际上,至少对于 Qt5 ,使用QLayout的replaceWidget可以替代B4adle7的解决方案更紧凑:

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