2012-01-06 11 views
5

2つのQDialogを重ねて表示し、各ダイアログのレイアウトのQWidget(グラフィックを数えて表示するウィジェット)に表示されたデータを共有します。Qt:表示される前に非表示になっているウィジェットを更新しますか?

現在示されているQDialogでは、ユーザーはそのデータを変更できます。この変更は両方のウィジェットに伝播され、正しい数が現在のQDialogに表示されます。しかし、ユーザーがそのQDialogを閉じ、その下のものが表示されると、数を示すQWidgetは、1秒間の古い値を表示してから正しい値に更新します。

他のQDialogが表示される前にQWidgetの値が正しいことがわかっていますが、を更新するダイアログが表示されない場合があります。が表示されます。

hiddenDialog->layout()->activate()

hiddenDialog->layout()->update()

しかし、それはまだ実際にダイアログが表示されるまで、更新に失敗:それはまだ隠された間、私はこれを試してみました。 Qt :: WA_DontShowOnScreenをオンにした後、QDialogを表示したいのを除いて、私の問題はQt: How to force a hidden widget to calculate its layout?に関連しているようです。

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

dialog->show()

しかし、ダイアログが画面に表示されていないまま:Qtの:: WA_DontShowOnScreenをオンにしてダイアログを更新した後、私は設定を試してみました。もう一度見えるようにする方法はありますか?あるいは、ダイアログとウィジェットが他のダイアログで隠されているときに更新する方法がありますか?要求されたよう


はここにいくつかの詳細です: 二つのクラス、Dialog1のとDialog2、QDialogクラスを拡張し、各拡張同じ基底クラス、BaseDialogがあります。

BaseDialogには、GlobalCountが変更されるたびに呼び出されるスロットがあります。このスロットはカウントの画像を描画するcountWidgetを更新します。

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

Dialog1のがDialog2を作成して示している(のQPushButtonクリックからの接続())スロットを有する:

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

Dialog2は(のQPushButton信号に接続されている)は、2つのスロット、グローバルから1つの減算を有しますもう一方はダイアログを閉じます。グローバル・カウントが減算されると、Dialog1とDialog2の両方のupdateCountWidget()スロットに接続された信号が出力されます。

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

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

[減算]ボタンをクリックすると、Dialog2の_countWidgetが正しく更新されていることがわかります。しかし、Dialog2を閉じてもう一度Dialog1を見ると、Dialog1の_countWidgetには分秒の元のカウント値が表示され、新しい値に更新されます。

私の目標は、この瞬間的な更新を防ぐことです。ユーザーにとっては本当にファンキーに見えます。これはぼんやりと長くなっていますが、私は洞察力に感謝します!

+0

Linuxで動作するQtが組み込まれています。もう少し完全であり理にかなった例を得るために作業します。 – Danny

+0

私はそれが基礎となるプラットフォームの内部構造に依存している可能性があり、異なるOSでも変更される可能性があることを誇りに思っています。 –

+0

[Qt:隠しウィジェットにレイアウトを計算させるにはどうすればいいですか?](http://stackoverflow.com/questions/2427103/qt-how-to-force-a-hidden-widget-to-calculate-そのレイアウト) – emkey08

答えて

6

コールあなたがウィジェット上

hide() 

その

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

setAttribute(Qt::WA_DontShowOnScreen, true); 

、それは私がLinuxの

に埋め込まれたQtのを使用

に動作します

+0

幻想的に働いた。ありがとう! – Danny

0

->activate()の前にhiddenDialog->layout()->update()を実行してみてください。それは私の場合と同じように動作し、WA_xxx属性を混乱させる必要はありませんでした。

関連する問題