Как заменить виджет другим с помощью Qt? - PullRequest
10 голосов
/ 07 января 2011

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

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

Ответы [ 2 ]

19 голосов
/ 26 мая 2011

У меня тот же вопрос, что и у Natim.

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

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

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

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

У моего кода есть базовый виджет 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 ()

Cheers .. надеюсь, это поможет.B

18 голосов
/ 07 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...