Как заменить Widget другим с помощью Qt?

У меня есть 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)
.

Знаете ли вы, как я могу удалить старый виджет и затем отобразить новый?

Ответ 1

Наиболее распространенным решением является использование QStackedWidget и размещение всех возможных виджетов в стеке. При выборе элемента просто вызовите setCurrentWidget, чтобы отобразить тот, который вы хотите.

Ответ 2

У меня есть тот же вопрос, что и Натим.

QStackedWidget - это решение для предустановленного макета. Он действует как flippy вещь в старой закусочной для музыкальной шкатулки. (X-количество альбомов в музыкальном автомате, перелистывание установленных альбомов).

Однако это не решает вопрос.

Например, у меня есть код, который я прототипирую с макетом пользовательского интерфейса, однако я хочу заменить некоторые из виджетов, которые действуют как владельцы мест с соответствующими виджетами, которые кодируются во время первичного выполнения script, или динамически создан.

Я уверен, что есть простая процедура или предостережение относительно правильного удаления/замены виджета.

Код, который у меня есть, имеет базовый виджет 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()

Приветствия.. надеюсь, что это поможет. В