2

私は、スロットと関数をエクスポートする dll を持っています。また、dll のいくつかのプライベート関数から放出されるシグナルもいくつか持っています。それが何かを助けるなら、dllはCOMコンポーネントです。

まず、完全な QT クラスをエクスポートし、Visual Studio 2010 で参照を追加したときにパブリック スロットと関数を表示できますが、シグナルは表示されません (必要かどうかはわかりません)。それらは「Q_SIGNALS」で宣言されています。

私が望むのは、これらの信号の 1 つを私の C# プロジェクトのメソッドに接続することです。QT のスロットへの信号のように、「信号 (QT)」から「メソッド (C#)」のようなものが必要です。これは可能ですか? どんな助けでも大歓迎です。

C++ (Qt)
signals:
  void mySignal(const QString& path);

以下に接続する必要があります。

C# (VS2010)
void myFunction(string path);
4

1 に答える 1

1

シグナルはクラスの関数ではないため、エクスポートされた Qt クラスには表示されません。これは、いかなる種類の C(++) 宣言でもありません。信号が実際にどこかに接続されている場合に、呼び出しコードを生成するために Qt プリプロセッサによって使用される名前付きのプレースホルダーです。シグナルは、スレッド化のコンテキストに応じて、2 つの異なるが単純なものになる可能性があります。シグナル送信オブジェクトが受信オブジェクトと同じスレッドに存在するかどうか:

  1. 単純な直接メソッド呼び出しとしてコンパイル
  2. スロット呼び出しは受信側のメッセージ キューに格納され、受信側のスレッドがメッセージ ループに戻ったときに実行されます。「スロット」は、「イベント ハンドラ」とも呼ばれます。

したがって、ケース 1 の場合、実際には Qt シンタックス シュガーはまったく必要ありません。Qt のポイントから C# メソッドを呼び出すだけですemit mySignal()。ただし、ケース 2 は Qt のように単純に行うことはできません。これは、レシーバーが QObject を継承する必要があるためです (これは C# で可能であることを認識していません)。ハンドラーを使用して独自のメッセージ ループをロールすることはできますが、Qt は役に立ちません。

于 2012-08-07T12:12:47.047 に答える