2

私はかなり長い間 Qt プログラマーであり、Qt の一般的な機能のほとんどを理解しています。connect ステートメントが実行時にシグナルをスロットに接続する方法について、私はまだ混乱しています。基本的に、コンパイル時に何が起こるか、実行時に何が起こるかを理解したい..

コンパイル時: メタ オブジェクト コンパイラは、追加の cpp ファイル (Q_OBJECT を含むクラスごとに 1 つ) にシグナルを実装するコードを生成します。

実行時: シグナルはスロットにマッピングされ、スロットは実行されますか? これは私がはっきりしていない部分です...SIGNALとSLOTSは、シグナル/スロット名の文字列表現に展開されるマクロです...これとメタオブジェクトは、実行時に呼び出しをスロットにマッピングするのにどのように役立ちますか? 詳細をいただければ幸いです...

編集: このリンクは、より良いアイデアを提供します..(血まみれの詳細に興味がある場合のみ...) http://dev.libqxt.org/libqxt/wiki/Meta_Object_Format

これを QMetaObject のドキュメントと組み合わせると、物事が明確になるはずです...

4

2 に答える 2

2

シグナルをメソッド (シグナル/スロット) に接続するには、さまざまな方法があります。

ただし、それらはすべて、正しいメソッド番号を取得することを中心に展開しています。

正しいメソッド番号とそれを呼び出すオブジェクトを取得したら、QObject で仮想化された関数 (qt_metacall) を呼び出すだけで、指定された番号から呼び出す正しいメソッドを見つけることができます。この関数は、MOC が生成するファイルに含まれています。また、その生成されたファイルには、クラスの静的 QMetaObject を作成する行があります。このオブジェクトは、スロットとシグナルの名前をメソッド番号に登録します。

これらは、読むのにいくつかの興味深いものを提供するかもしれません:

http://doc.qt.io/qt-5/qmetaobject.html
http://doc.qt.io/qt-5/metaobjects.html
http://doc.qt.io/qt-5/signalsandslots. html

スロットのアクティベーションをデバッガーで実行することで、多くのことを学ぶこともできます。

于 2011-03-14T12:01:02.137 に答える
0

基本的に、シグナルとスロットは、Objective-C のメッセージと同様に機能します。

マクロにより、プリプロセッサは、スロットが呼び出されたときに効果的に実行される関数/メソッドを「登録」および「検索」するコードに置き換えます。

これにより、シグナルを送信したりスロットを呼び出したりするコードは、それらを使用する他のコード モジュールについて多くを知る必要がないため、柔軟性が向上します。各スロットとシグナルは、実行時に検索されて呼び出される署名を生成します。

C/C++ に精通している場合は、これを動的ライブラリと比較できます。シンボルは実行時に検索され、そのアドレスを使用して CPU がシンボルに「ジャンプ」して実行されます。

また、次のリンクも役立ちます。

于 2011-03-14T11:37:50.053 に答える