我左边有一个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)
但它不起作用并且所有小部件都相互叠加:
你知道如何删除旧的小部件,然后显示新的小部件吗?
答案 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)