2011-01-07 19 views
10

Ho un QHBoxLayout con un QTreeWidget a sinistra, un separatore nel mezzo e un widget a destra.Come sostituire un Widget con un altro usando Qt?

Quando clicco sul QTreeWidget, voglio cambiare il widget sul diritto di modificare il QTreeWidgetItem

ho provato a farlo con questo codice:

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) 

Ma non funziona e tutti i widget sono impilati uno sull'altro:

Exemple of the bug http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg.

Sai come posso rimuovere il vecchio widget e il prossimo visualizzare quello nuovo?

risposta

16

La soluzione più comune è utilizzare QStackedWidget e inserire tutti i possibili widget nello stack. Quando selezioni un articolo, chiama lo setCurrentWidget per visualizzare quello che desideri.

+0

Bello, ci provo. Grazie – Natim

16

Ho la stessa domanda di Natim.

QStackedWidget è una soluzione per un layout predefinito. Si comporta come la cosa flippy in un vecchio ristorante per un carillon. (Quantità X di album nel jukebox, sfoglia gli album installati).

Tuttavia questo non risolve la domanda.

Ad esempio, ho codice che sto prototipando con un layout dell'interfaccia utente, tuttavia voglio sostituire alcuni dei widget che fungono da segnaposto con i widget corretti codificati durante l'esecuzione dello script principale o creati dinamicamente .

Sono sicuro che esiste una semplice procedura o avvertenza su come rimuovere/sostituire correttamente un widget.

Il codice che ho ha un widget textEdit di base in una griglia. Voglio codificare una versione personalizzata di questo widget per il drag and drop e quindi sostituirlo con il textEdit predefinito.

Come Natim, il codice sembra logicamente valido, tuttavia i widget sono impilati nel layout come se si fosse rovesciato un borsellino.

Speriamo che riesca a capire il trucco e a ripubblicare l'avvertenza.

SOLUZIONE:

Voilà !! Trovato qualcosa che sicuramente fa il trucco. CHIUDI il tuo widget

# 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() 

Ho rimosso il widget dal layout, quindi chiuso il widget. A questo punto la variabile che sto usando è aperta per creare il mio widget personalizzato/modificato e quindi reinserirla nel layout

Sì, è necessario un po 'più di eleganza per gestire layout più complicati, ma il bisogno fondamentale di distruggere un widget per sostituirlo è nel metodo .close()

Cheers .. spero che questo aiuti. B

Problemi correlati