2012-01-06 18 views
5

Tengo dos QDialogs apilados uno encima del otro, con algunos datos compartidos entre ellos que se muestran en un QWidget en el diseño de cada diálogo (un widget que muestra un conteo gráficamente).Qt: ¿Actualizar widgets que están ocultos antes de que se muestren?

En el QDialog que se muestra actualmente, el usuario puede cambiar esa información. Este cambio se propaga a ambos widgets, y el conteo correcto se muestra en el QDialog actual. Sin embargo, cuando el usuario cierra ese QDialog, y el que está debajo se vuelve visible, el QWidget que muestra el recuento muestra el valor anterior durante una fracción de segundo antes de que se actualice al valor correcto.

Sé que el QWidget debajo tiene el valor correcto antes de que se muestre el otro QDialog, pero parece que no puedo obtener el cuadro de diálogo para actualizar antes de que esté visible. He intentado esto mientras todavía estaba oculto:

hiddenDialog->layout()->activate()

hiddenDialog->layout()->update()

Sin embargo, todavía no se puede actualizar en realidad hasta después de diálogo se muestra. Mi problema parece estar relacionado con Qt: How to force a hidden widget to calculate its layout?, excepto que quiero mostrar el QDialog luego de configurar Qt :: WA_DontShowOnScreen. Después de encender Qt :: WA_DontShowOnScreen y actualizar el diálogo, traté de ajuste:

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

dialog->show()

Pero el diálogo no permanece en pantalla en la pantalla. ¿Hay alguna manera de hacerlo visible de nuevo? ¿O hay alguna forma de actualizar el diálogo y los widgets cuando están ocultos por el otro diálogo?


Aquí hay más detalles como solicitada: Hay dos clases, Dialog1 y Dialog2, extendiéndose cada uno de la misma clase base, BaseDialog, que extiende la clase QDialog.

BaseDialog tiene una ranura que se llama cuando se cambia GlobalCount. Esta ranura actualiza un conteo que dibuja una imagen del recuento.

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

Dialog1 tiene una ranura (conectado de una QPushButton click()) que crea y muestra un Dialog2:

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

Dialog2 tiene dos ranuras (conectado a señales QPushButton), uno de resta de lo global contar, el otro cierra el diálogo. Cuando se resta el recuento global, emite una señal conectada a la ranura updateCountWidget() de Dialog1 y Dialog2.

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

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

Al hacer clic en el botón de resta, puedo ver el _countWidget de Dialog2 actualiza correctamente. Sin embargo, cuando cierro Dialog2 y vuelvo a ver Dialog1, el _countWidget de Dialog1 muestra el valor de recuento original durante una fracción de segundo y luego actualiza el nuevo valor.

Mi objetivo es evitar esta actualización momentánea, ya que se ve realmente funky para el usuario. Esto se ha vuelto obscenamente largo, ¡pero aprecio cualquier idea!

+0

Qt embedded ejecutando en Linux. Trabajaré en obtener un ejemplo que sea un poco más completo y tenga sentido. – Danny

+0

Tengo miedo de que pueda depender de las partes internas de la plataforma subyacente, y también podría cambiar en diferentes OS'es. –

+0

posible duplicado de [Qt: ¿Cómo forzar un widget oculto para calcular su diseño?] (Http://stackoverflow.com/questions/2427103/qt-how-to-force-a-hidden-widget-to-calculate- its-layout) – emkey08

Respuesta

6

llamada

hide() 

el widget cuando lo hace

setAttribute(Qt::WA_DontShowOnScreen, true); 

Después de eso

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

y funcionará

utilizo Qt embebidos en Linux

+0

Funcionó fantásticamente. ¡Gracias! – Danny

0

También podría intentar hacer un hiddenDialog->layout()->update() antes del ->activate(), que funcionó en un caso similar para mí, y no era necesario molestarse con los atributos WA_xxx.

Cuestiones relacionadas