Как заменить виджет на другой с помощью 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)
Но это не работает, и все виджеты складываются друг на друга:
Знаете ли вы, как я могу удалить старый виджет и затем отобразить новый ?
2 ответов:
Наиболее распространенным решением является использование
QStackedWidgetи поместите все возможные виджеты в стек. При выборе элемента, просто вызовитеsetCurrentWidget, чтобы отобразить тот, который вы хотите.
У меня тот же вопрос, что и у Натима.
QStackedWidget-это решение для предустановленной компоновки. Он ведет себя как легкомысленная вещь в старой закусочной для музыкальной шкатулки. (X-количество альбомов в музыкальном автомате, пролистайте установленные альбомы).
Однако это не решает вопроса.Например, у меня есть код, который я прототипирую с макетом пользовательского интерфейса, однако я хочу заменить некоторые виджеты, которые действуют как держатели места, на соответствующие виджеты, которые закодированы во время первичное выполнение скрипта, или создается динамически.
Я уверен, что существует простая процедура или предостережение о том, как правильно удалить/заменить виджет.
Код у меня есть элементарные виджет батареи в виде таблицы. Я хочу закодировать пользовательскую версию этого виджета для перетаскивания, а затем поменять его на textEdit по умолчанию.
Как и Natim, код кажется логически обоснованным, однако виджеты случайно нагромождены в макете, как демпинг a кошелек.
Надеюсь, что мы сможем понять этот трюк и перепечатать предупреждение.
Решение:
Вуаля!! Нашел кое-что, что определенно делает трюк. Закройте виджет
# 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 ()
Ура.. надеюсь, это поможет. B
Comments