2012-01-03 11 views
8

実行時にQt信号スロット接続コールをチェックすることは私の心配です。私は、接続ステートメントの静的なチェックを実行することが可能でなければなりません。コンパイル中にシグナル/スロット接続のチェックを行うにはどうすればよいですか?

このようなツールはありますか?

+4

このツールはQt 5です:http://woboq.com/blog/new-signals-slots-syntax-in-qt5.html :) – mlvljr

+1

@mlvljr私は数週間前、その偉大な、しかし、私は利益を得るために変更するためのコードがたくさんあります。 –

答えて

3

:大Qt4をコードベースで作業するには

connect(sender, &Sender::signalMethod, receiver, &Receiver::slotMethod); 
3

このようなツールはありますか?

シグナル/スロットメカニズムがqtで実装されているため、このようなツールが存在するといいですが、残念ながら存在しません。また、その理由から、信号がスロットに適合するかどうかを静的にチェックすることは不可能である。

qtがboostのシグナル/スロットのようなものを使用した場合、それは可能です。

+0

なぜできないのかを考えてみましょうか?完全なソースツリーでは、信号とスロットを比較できないようにすべき理由がわかりません。確かに私は一度に複数のファイルを見る必要がありますが、それはまだ可能であるはずです。 –

+0

@PhilHannent [このページ](http://developer.qt.nokia.com/doc/qt-4.8/signalsandslots.html)には、QTのシグナル/スロットが記載されています。いくつかの制限(例えば、SIGNALとSLOTの間違った署名)まで可能です。確かに、それを行う独自のツールを書くことはできますが、QTの現在の実装ではできません。 –

2

CでGCCプラグインを作成するか、MELTという拡張子を使用することを検討します.MELTは、GCC拡張機能を簡単にコーディングするためのドメイン固有の言語です。プラグインまたはMELT拡張を使用すると、内部表現(特にC++クラスの&関数宣言を表すTree-s)を分析して、そのための特定のツールを作成できます。

しかし、GCCを拡張するには、その非常に複雑な内部表現を理解する必要があり、GCC内部を知らない人には1週間以上の努力が必要です。

あなたのQtアプリケーションが本当に大きければ、このような努力は価値がありません。 MELTを使って作業することを検討するなら、私はあなたを助けてくれることを嬉しく思います。

1

コンパイル時にこれをチェックすることはできませんが、Qt Creator内でデバッグモードでプログラムを実行すると、connect呼び出しが失敗した場合に、アプリケーションウィンドウで役に立つ診断メッセージが表示されます。 my answer hereを参照してください。

+0

私はコンパイル時に文字通り、実行されているツール(qmake、nmake/make、cppcheckなど)の一部と同じ意味ではありませんでした。私はアプリケーションメッセージを出力していますが、オブジェクトを動的に作成した場合、テストするたびにそれらのオブジェクトの少なくとも1つを作成する必要があるため、テストするのが非常に難しくなります。 –

2

私は私のコードでは、このようなものを使用しました:私は)それを使用する代わりに、(接続するための簡単な呼び出し

#define CONNECT_OR_DIE(source, signal, receiver, slot,connection_type) \ 
    if(!connect(source, signal, receiver, slot,connection_type)) \ 
     qt_assert_x(Q_FUNC_INFO, "CONNECT failed!!", __FILE__, __LINE__); 

を。それはあなたを助けますか?あなたは静的にコンパイル時にチェックされ、次の構文を使用することができますQT5を使用

+2

これは実行時であり、コンパイル時ではありません。 -1 – weberc2

+0

@ weberc2あなたはコンパイル時の解決法を知っていますか?投稿する。あなたは投稿を読んだことがありますか? – UmNyobe

+1

@UmNyobeはい私は記事を読んだ。あなたはその質問を読んだのですか? ;)そして、いいえ、私はコンパイル時の解決法を知らない(それがあなたの答えを読んだ理由です)。 :) – weberc2

1

は私がclang static analyzer

のためのプラグイン ようなチェッカーを書いてください: http://reviews.llvm.org/D14592

例のテストカバレッジ:

connect(&send, SIGNAL(f2(int, double*)), &recv, SLOT(bugaga(int, double*))); // expected-warning{{Can not find such slot}} 
関連する問題