Как заменить виджет на другой с помощью 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)


Но это не работает, и все виджеты складываются друг на друга:



Исключение ошибки http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg .



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

978   2  

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

    Ничего не найдено.