Topic: MainWindow: Sostituzione di un QWidget nel centralWidget  (Letto 186 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Buongiorno a Tutti.
Ho creato una MainWindow, utilizzo per la parte grafica QDesigner,
per poi settare la gui nel codice con
uic.loadUi("..\\path\\file_ui.ui", self)
.

Nel centralWidget, di nome central_widget, ho messo degli spacer, un QFrame contenente un QLabel e una QProgressBar.
Il codice, dopo aver effettuato delle operazioni di configurazione, segnalate dalla progressBar e dalla statusBar,
apre una QDialog per richiesta di una conferma, dopodiché si chiude la QDialog e dovrei sostituire nel centraWidget
l'attuale QFrame, di nome frameIntro, con un altro QWidget o QFrame.
Il problema è che non riesco a farlo, perchè il centralWidget non ha l'attributo addWidget!!!
# DISEGNA DATI UFFICIO
    def drawDatiUfficio(self):
        # verificare effettiva DISTRUZIONE del QWidget!!!!!!!!!!!
        self.frameIntro.destroy()
        self.frameIntro.setParent(None)

        from ReTaBo_Beta.grafica import frameDatiUfficio
        self.frameDati = frameDatiUfficio.FrameDatiUfficio(self)

        #!!!!!!
        self.central_widget.addWidget(self.frameDati)


Riesco soltanto se imposto il nuovo QFrame, di nome frameDati,
come centralWidget
self.setCentralWidget(self.frameDati)

però volevo, per una questione di settaggi grafici, rimanere inalterata
la centraWidget e cambiare soltanto il suo contenuto.

Qualcuno può aiutarmi nella soluzione del problema?
Grazie.

Offline Anakin73

  • python unicellularis
  • *
  • Post: 10
  • Punti reputazione: 0
    • Mostra profilo
Re:MainWindow: Sostituzione di un QWidget nel centralWidget
« Risposta #1 il: Gennaio 30, 2021, 16:22 »
Quello che manca è un QLayout dove mettere e togliere gli oggetti che desideri.
Puoi immaginare il QWidget come un luogo generico "astratto",i QLayout dei contenitori, i QFrame come dei fogli e tutti gli altri oggetti  qualcosa da attaccare sui fogli o mettere nei contenitori.
Comunque la risposta che cerchi è utilizzare self.frameIntro.setParent(None) per togliere il QFrame dal central_Widget e self.frameDati.setParent(self.central_Widget) per mettere quello nuovo, come sembrerebbe tu abbia fatto ma, pur non conoscendo la classe FrameDatiUfficio, potrei ipotizzare che quel self non viene incanalato correttamente.
Dovrebbe essere una classe tipo questa, per dire all'oggetto self.frameDati di legarsi con central_Widget
class FrameDatiUfficio(QtWidgets.QFrame):
    def __init__(self,parent):
        super().__init__(parent)

Ma la soluzione più "elegante", a mio avviso, è utilizzare: self.mioLayout = QtWidgets.QLayout(self) - ci sono le varianti HBOX, VBOX e GRID che si adattano meglio alle tue esigenze - per creare il contenitore con tutte le caratteristiche di expanding, alignment ecc...
poi  self.mioLayout.clear() per svuotare il contenuto e self.mioLayout.addWidget(self.frameDati)