2

クラスを拡張するQWidgetクラスがあり、このクラスは QtDesigner によって生成された Ui クラスを使用します。次のようなもの:

class MyWidget : public QWidget
{
   signals:
            void pushButtonClicked();
   // ....
   private:
            Ui::MyUi ui;

}

MyWidget::MyWidget()
{
    ui = new Ui::MyUi();
    ui->setupUi(this);
}

QPushButton * pushButton内にフィールドがあるとしましょうUi::MyUi。このウィジェットの UI には、複雑なビジネス ロジックはありません。

ここで、 がクリックされるたびpushButtonに、このウィジェットがシグナルを発する必要があります (これを と呼びましょうpushButtonClicked()。これが達成されると想像できる唯一の方法は次のとおりです。

  1. clicked()オブジェクトのシグナルをpushButtonローカルスロットに接続しpushButtonClicked()、そこからシグナルを発信します。

  2. MyWidgetのmouseEventFilterとしてインストールしpushButton、内部で処理しますMyWidget::mouseClickedEvent

他のオプションはありますか?Qt フレームワークに 'MyWidget::pushButtonClicked()' を代わりに使用させるようにpushButton->clicked()

MyWidgetプロジェクトでは、集約または継承によって UI をラップ/抽象化する のようなラッパー クラスからこのような信号の受け渡しが必要な、このような多くのシナリオがあります。一般に、より良い設計、特にコードの再利用のための最良のアプローチと考えられているものはどれですか。プロジェクトが初期段階にあり、これらの UI のどれが将来複雑なビジネス ロジックを必要とするかがわからない場合。

QPushButton の拡張はオプションではないことに注意してください。

4

1 に答える 1

7

信号を直接接続できます =)

connect(pushButton , SIGNAL(clicked()), this, SIGNAL(pushButtonClicked()));
于 2011-06-21T15:30:06.790 に答える