2012-01-06 17 views
5

Ho due QDialogs impilati uno sopra l'altro, con alcuni dati condivisi tra loro mostrati in un QWidget nel layout di ogni finestra di dialogo (un widget che mostra graficamente un conteggio).Qt: aggiorna i widget che sono nascosti prima che vengano mostrati?

Nel QDialog attualmente visualizzato, l'utente può modificare tali dati. Questa modifica viene propagata ad entrambi i widget e il conteggio corretto viene visualizzato nel QDialog corrente. Tuttavia, quando l'utente chiude quel QDialog e quello sottostante diventa visibile, il QWidget che mostra il conteggio mostra il vecchio valore per una frazione di secondo prima di essere aggiornato al valore corretto.

So che il QWidget sotto ha il valore corretto prima che venga visualizzato l'altro QDialog, ma non riesco a ottenere la finestra di dialogo per aggiornare prima di è visibile. Ho provato questo mentre era ancora nascosta:

hiddenDialog->layout()->activate()

hiddenDialog->layout()->update()

ma non riesce ancora ad aggiornare in realtà fino a dopo dialogo viene visualizzata. Il mio problema sembra legato allo Qt: How to force a hidden widget to calculate its layout?, tranne che voglio mostrare il QDialog dopo aver impostato Qt :: WA_DontShowOnScreen su. Dopo aver acceso Qt :: WA_DontShowOnScreen e aggiornare la finestra, ho provato a installare:

dialog->setAttribute(Qt::WA_DontShowOnScreen, false);

dialog->show()

Ma il dialogo non rimane visualizzato sullo schermo. C'è un modo per renderlo nuovamente visibile? O c'è un modo per aggiornare la finestra di dialogo e i widget quando sono nascosti dall'altra finestra di dialogo?


Ecco qualche dettaglio in più, come richiesto: Ci sono due classi, Dialog1 e Dialog2, ogni estensione della stessa classe base, BaseDialog, che estende la classe QDialog.

BaseDialog ha uno slot che viene chiamato ogni volta che si modifica il GlobalCount. Questo slot aggiorna un countWidget che disegna un'immagine del conteggio.

void BaseDialog::updateCountWidget() 
{ 
    _countWidget->updateCount(globalCount); 
    _countWidget->update(); 
} 

Dialog1 presenta un'asola (collegata da un QPushButton click()) che crea e mostra un Dialog2:

void Dialog1::showDialog2() 
{ 
    Dialog2* dialogTwo = new Dialog2(); 
    dialog2->show(); 
}  

Dialog2 ha due slot (collegato a segnali QPushButton), uno sottrarre dal globale conta, l'altro chiude la finestra di dialogo. Quando il conteggio globale viene sottratto, emette un segnale collegato allo slot updateCountWidget() di Dialog1 e Dialog2.

void Dialog2::subtractCount() 
{ 
    GlobalCount.subtractOne(); 
} 

void Dialog2::userClosed() 
{ 
    accept(); 
} 

Quando clicco sul pulsante Sottrai, posso vedere il _countWidget di Dialog2 aggiornare correttamente. Tuttavia, quando chiudo Dialog2 e posso visualizzare nuovamente Dialog1, il _countWidget di Dialog1 mostra il valore di conteggio originale per un frazione di secondo, quindi aggiorna il nuovo valore.

Il mio obiettivo è impedire questo aggiornamento momentaneo, in quanto sembra davvero funky per l'utente. Questo è diventato oscenamente lungo, ma apprezzo qualsiasi intuizione!

+0

Qt integrate su sistemi Linux. Lavorerò per ottenere un esempio un po 'più completo e sensato. – Danny

+0

Ho paura che possa dipendere dagli interni della piattaforma sottostante e potrebbe anche cambiare su diversi SO. –

+0

possibile duplicato di [Qt:? Come forzare un widget nascosto per calcolare il layout] (http://stackoverflow.com/questions/2427103/qt-how-to-force-a-hidden-widget-to-calculate- its-layout) – emkey08

risposta

6

chiamata

hide() 

il widget di quando si fanno

setAttribute(Qt::WA_DontShowOnScreen, true); 

Dopo che

setAttribute(Qt::WA_DontShowOnScreen, false); 
show() 

e funzionerà

che uso Qt incastonato su Linux

012.
+0

Ha funzionato in modo fantastico. Grazie! – Danny

0

Si potrebbe anche provare a fare un hiddenDialog->layout()->update() prima della ->activate(), che ha lavorato in un caso simile per me, e non c'è bisogno di pasticciare con gli attributi WA_xxx è stato richiesto.

Problemi correlati