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

Nat*_*tim 10 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)
Run Code Online (Sandbox Code Playgroud)

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

错误的例子http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg.

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

小智 20

我和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()
Run Code Online (Sandbox Code Playgroud)

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

是的,处理更复杂的布局需要更优雅,但是为了替换它而破坏窗口小部件的基本需求是在.close()方法中

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


Luk*_*ský 18

最常见的解决方案是使用QStackedWidget所有可能的小部件并将其放入堆栈中.选择项目时,只需打电话setCurrentWidget即可显示所需的项目.


S81*_*818 10

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

containing_layout = placeholder.parent().layout()
containing_layout.replaceWidget(placeholder, new_widget)
Run Code Online (Sandbox Code Playgroud)