Ответ 1
Наиболее распространенным решением является использование QStackedWidget
и размещение всех возможных виджетов в стеке. При выборе элемента просто вызовите setCurrentWidget
, чтобы отобразить тот, который вы хотите.
У меня есть 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)
.
Знаете ли вы, как я могу удалить старый виджет и затем отобразить новый?
Наиболее распространенным решением является использование QStackedWidget
и размещение всех возможных виджетов в стеке. При выборе элемента просто вызовите setCurrentWidget
, чтобы отобразить тот, который вы хотите.
У меня есть тот же вопрос, что и Натим.
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()
Приветствия.. надеюсь, что это поможет. В