2011-10-28 4 views
12

QWidgetのためにQDialogから終了信号のようなものを探しています。理由は、ウィジェットがポップアップするとツールバーを無効にします(これは問題ではありません)。ウィジェットが閉じられるとツールバーを再度有効にします。QWidgetから仕上げられた信号のようなものが必要です

ビジネスクラスでGUIコードを使用するため、そのウィジェットのクローズイベントをオーバーライドすることもできません。

+1

ウィジェットからの信号を送信しますか?あるいは 'destroyed()'シグナルをキャッチしますか? – RedX

+2

最後の行は本当に意味をなさない。ウィジェットはGUIアイテムで、その閉じるイベントはGUIコードです。なぜそれを上書きすると、GUIとビジネスロジックが混在するのでしょうか? – Mat

答えて

14

あなたは近くに削除するウィジェットを設定し、そのdestroyed信号を聞くことができます。

widget->setAttribute(Qt::WA_DeleteOnClose); 
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*))); 

ことだけをあなたがウィジェットの内容に興味がないなら動作します。ポイントdestroyed()が発行された時点で、ウィジェットはもうQWidgetではなく、QObjectdestroyed()~QObjectから放出される)なので、QObject*QWidgetにキャストすることはできません。

単純な代替方法は、QDialogでウィジェットをラップすることです。

+0

最初のものはかなりうまくいく、ありがとう。 – LarissaGodzilla

+0

こんにちはFrank、 'widgetDestroyed'スロットはどうやって実装しますか? – SexyBeast

+0

これは、ウィジェットが破壊されたときに何をしたいかによって異なりますが、スロットに何をするのかは一般的な答えはありません。 –

0

QWidgetは実際には多くの信号を持っていませんが、ドキュメントによると合計で2です。しかし、それは自分で信号を指定して使用することはできません。

9

あなたのウィジェットクラスでは、他の人が接続できる独自の信号を追加できます。次に、closeEvent()メソッドをオーバーライドします。このメソッドをオーバーライドすることについて心配する必要はありません。このような状況はまさに正しい理由です。 closeEvent方法で

class MyCustomWidget: public QWidget 
{ 
    Q_OBJECT 

    ... 

    signals: 
     void WidgetClosed(); 

    protected: 

    //=============================================================== 
    // Summary: Overrides the Widget close event 
    // Allows local processing before the window is allowed to close. 
    //=============================================================== 
    void closeEvent(QCloseEvent *event); 

    } 

あなたの信号をトリガ:

void MyCustomWidget::closeEvent(QCloseEvent *event) 
{ 
     emit WidgetClosed(); 
     event->accept(); 
} 
+0

私はすでにそれをしましたが、何らかの理由で私が思っていただけでなく、理解していないかもしれないと私のチームリーダーはそれを望んでいませんでした。しかし、私はそのことについて彼に話し、他の可能な方法がはるかに意味がないことを見ています。 – LarissaGodzilla

関連する問題