2017-07-03 8 views
0

、私は次のような状況があります。同時に/つだけQMessageBoxませダブル

  1. ベリファイ方式ではQTabWidgetの入力のために、私はサブのエラーを決定するために来ていますウィジェットの入力。私は私が活性化した後QMessageBox
  2. を表示するつもりせる方法onShowEventFinished()QTimer::singleShotを発射しています。このウィジェットのshowEventでアクティブウィジェット
  3. としてこのサブウィジェットを設定することの原因で
  4. 新しいサブウィジェット、私は最初に私の検証(ステップ1)からのエラーメッセージを表示したい。

したがって、verifyのメッセージが表示されますが、手順3で私のsingleShotが原因で、もう1つが表示されます。私は、最初のものが閉じられたときに、最も早く2番目のものを表示したい。

例コード(それは、最初のメッセージが早いときに関するサブウィジェットイストの上映で表示されることが重要です。):、私はQMutexでこれを解決するためにさまざまな方法を試してみた

class MySubwidget : public QWidget 
{ 
    // omitted (ctor, etc.) 

    protected: 
     void showEvent(QShowEvent* e) 
     { 
      QShowEvent(e); 
      QTimer::singleShot(200, this, SLOT(onShowEventFinished())); 
     }; 

    private slots: 
     void onShowEventFinished() 
     { 
      bool showEntryHint = false; 
      // omitted (some stuff to determine to show an entry hint or not) 
      if(showEntryHint) 
      { 
       QMessageBox t_MessageBox(this); 
       // omitted (set up the message box 
       t_MessageBox.exec(); 
      } 
     }; 
}; 
+0

クラスにQMessageBox型のフィールドを作成して使用することができます。常に静的メソッドのみを使用するのは珍しいことではありません:) –

答えて

0

QWaitConditionQSemaphoreは派生クラスのQMessageBoxですが、メッセージボックスの実行が同じスレッド内にあるため、これは機能しません。最初exec()は、最初のメッセージボックスまで生きている間

最初のメッセージボックスがQApplication::processEventsよりQMessageBox::exec()で開始されたときにこれは、意味は、(QMessageBoxによって呼び出された)、私のスロットのinvokementを引き起こし、第二のヒントのために二回(QMessageBox::exec()と呼ばれます閉じています)。

私の現在の回避策、私がいる限りMyMessageBoxの別のインスタンスが示されているようQApplication::processEvents()を呼んでいるサブクラス持つようになりました:

class MyMessageBox : public QMessageBox 
{ 
    public: 
    // omitted (ctor, etc.) 

    int exec() 
    { 
     while(MessageBoxShowingCount > 0) 
      QApplication::processEvents(); 
     return QMessageBox::exec(); 
    }; 

    protected: 
    void showEvent(QShowEvent* e) 
    { 
     MessageBoxShowingCount++; 
     QMessageBox::showEvent(e); 
    }; 

    void hideEvent(QHideEvent* e) 
    { 
     QMessageBox::hideEvent(e); 
     MessageBoxShowingCount--; 
    }; 

    static int MessageBoxShowingCount = 0; 
}; 

は(このソリューションのために私がして、すべての私の QMessageBox -instancesを交換したが MyMessageBox -instance)

+0

すべてのGUIコードはシングルスレッドです。同期プリミティブの使用は不要です。 –

0

あなたが必要と思われるのは、アプリケーション全体のメッセージマネージャです。 QMessageBoxは、そのクラスの実装の詳細になり、もはや直接使用されません。メッセージを表示する場合は、MessageManagerクラスを使用します。

+0

これは素晴らしい拡張ですが、主な問題は 'QMessageBox :: exec()'の中の 'processEvents()'が2番目のメッセージボックスを表示するメソッドを呼び出すことです。これは、QMessageBox :: exec()を呼び出す前に静的カウンタと独自の 'processEvents()'を使って解決したいことでした。 –

+0

イベントループをネストしないでください。うまくいくでしょう。メッセージボックスで 'exec()'を呼び出す必要はありません。 –

+0

Kuba Ober:代わりに 'show()'を使うのですか?しかし、私が質問メッセージボックスを持っていれば、どうすれば応答コードを得ることができますか? –

関連する問題