3

ウィジェット(mainWidget)と別のウィジェット(childWidget)があり、それはその子です。

したい:

connect(childWidget, SIGNAL(somethingHappened(...)), mainWidget, SLOT(handleIt(...));

私の質問は、connectステートメントをmainWidgetまたはchildWidgetに配置しますか?

  • mainWidgetのコンストラクターでchildWidgetを作成し、connectステートメントを次の行に配置すると、機能します。ただし、childWidgetが作成されると、何かを実行してから
    、mainWidgetの成功を通知するとします。connectステートメントが、シグナルを発行する(childWidgetの)関数の後にのみ来るという状況が発生する可能性があります。

  • connectステートメントをchildWidgetのコンストラクターに配置すると、問題は、親の スロット
    について何も知らないことです。
    childWidgetにmainWidgetを継承させると
    、スロットについて認識しますが、これは私にとって悪い解決策のように感じます。とにかくそれを動作させることができませんでした。これを行うにはおそらく適切な方法があります-私はまだ探しています。

私はQtプログラミングにまったく慣れていません。事前に:助けてくれてありがとう。

4

2 に答える 2

1

不思議なバグの忍び寄りを避けるために、コードをうまく設計する必要があります。メインウィジェットで接続を記述することをお勧めします。理想的には、子ウィジェットのコンストラクターにemitがないようにする必要があります。おそらく、emitコードを別のブロックに移動し、構築が完了した後に呼び出しを行うことができます。スロットにアクセスするためだけに「mainWidget」から「childwidget」をサブクラス化すると、柔軟性のない設計のように見えます。あるクラスがあなたのクラスが発する信号を知っている場合、他のクラスがそれに柔軟に接続できるように設計する必要があります。

于 2012-10-31T11:28:27.733 に答える
1

子を作成したクラス内のオブジェクトの構築後に、常に接続呼び出しを行います。理由は単純です。子を作成するオブジェクトは、子が持つ信号/スロットとその目的に必要な信号/スロットを知っていますが、子はそれを知ることができず、より重要性を知る必要はありません。子供が親に対して必要以上に期待している場合は、コードの再利用性を制限します。

コンストラクターのシグナルは誰にも聞こえないというのは正しいことです。コンストラクターで仮想関数を使用してはならないのと同じように、コンストラクターでシグナルを使用しないでください。初期化時にシグナルを発行する必要がある場合は、別のini関数を記述し、の後に呼び出しますconnect

qobject_cast実行時に親のタイプを判別するために使用することもできますが、それは単に悪い設計です。

于 2012-10-31T12:02:48.620 に答える