1

Windows 7 SP1
MSVS 2010
Qt ライブラリ Windows 用 4.8.4 (VS 2010)
Qt4 用 Visual Studio アドイン 1.1.11

最初は、このスロットが起動しなかった理由がわかりませんでした。

connect (lineEdit, SIGNAL(textChanged(const QString &)),
         this, SLOT(enableFindButton(const Qstring &)));

diff はそれを明確にしました: Qstring は QString であるべきです。

私の質問: なぜコンパイルされたのですか? 実際、これは次のようにコンパイルされます。

connect (lineEdit, SIGNAL(textChanged(const nonsense &)),
         this, SLOT(enableFindButton(const more_nonsense &)));

これは予想される動作ですか?これでエラーが発生しないのはなぜですか?

4

1 に答える 1

6

私が知っている限り、Qt がどのように機能するかを理解している限り、接続線はコンパイル時ではなく実行時に機能します。これは、コードフローがその部分に到達したときに、信号とスロットを接続するために必要なすべての操作が実行されることを意味します。

Qt について重要なことを思い出してください。一部の呼び出しはマクロのみであり、C++ 関数ではありません。たとえば、シグナルとスロットのメカニズムを有効にするためにクラス宣言に追加する必要がある行「Q_OBJECT」はマクロです。また、connect 呼び出しはマクロ (...)、emit はマクロなどです。MOC (プリコンパイラ、Qt マクロを実際のコードに変換) がコードを分析すると、これらの呼び出しは実際のコードに展開されます。

また、繰り返しますが、シグナル/スロット メカニズムは、私の知る限り、コンパイル時間ではなく実行時に機能します。接続マクロのドキュメントを読むと、そこに配置した「SIGNAL」および「SLOT」マクロは、そこに配置したものを文字列に変換すると書かれています。明らかに、何らかの形式で、複雑すぎる可能性があります。手動で使用されるため、そこで動作する文字列であるため、コンパイルでは、実行時にチェックされる文字列が正しいかどうかをチェックできません。

私の下手な英語があなたに理解してもらえることを願っています。また、私の知識が十分に大きく、間違った言葉を (言いすぎないように) 言っていないことを願っています。

于 2012-12-29T00:57:36.437 に答える