2012-03-29 8 views
11

QWidgetからクラスを継承せずに、QtスロットとしてC++関数を使用する方法はありますか?QtスロットとしてのC++関数の使用

+0

重複しているかどうかわかりませんが、これは役立ちます:http://stackoverflow.com/questions/8533906/ –

答えて

8

あなたはできないのQtのバージョンで<のQt 5

メタオブジェクトコンパイラが呼び出されなければなら信号/スロットを使用するために。

  • QObjectから継承やその他のサブクラス(例えばQWidgetQPushButtonなど)Q_OBJECTマクロが順にクラスのプライベートセクションで定義されている必要があり
  • :これはあなたのクラスには、次の要件を満たしている必要があります実現するためにそのようなスロットとしてメタオブジェクトの機能を有効にする
  • 使用スロットまたは信号
としてメタコンパイラによってハンドルであるべき機能を宣言するために Qtキーワード slotssignals詳細については

QObjectマニュアルを確認とsignals & slots

約対応する文書ページをチェック:

Q_OBJECTマクロ信号、スロットまたはを実装する任意のオブジェクトのために必須であることに注意してくださいプロパティ。また、ソースファイルで Meta Object Compilerを実行する必要があります。 に失敗すると、特定の関数が奇妙な動作をする可能性があるため、 が実際にシグナル、スロット、およびプロパティを使用しないかどうかにかかわらず、このマクロの をQObjectのすべてのサブクラスで使用することを強くお勧めします。

編集:Qt 5以降では、ファンクタとラムダ式をスロットとして使用できます。 New Signal Slot Syntax in Qt 5

+1

しかし、これはQt 4では不可能ですが、 Qt 5で可能になるためには、新しい信号/スロット機構を使用して。 http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir

+0

あなたは正しいですが、IMHOはごくまれにしか使用しないでください。スロットを使うことは、単純な関数でtr1 :: bindを使うよりもエレガントです。 – pnezis

+0

私はまったく同意する、彼らはまれな発生でなければならない。短い文章のif文とよく似ていますが、それらは非常に狭い一連の状況で役に立ち、そのような場合には読みやすさとメンテナンスの容易さが向上します。しかし、それらは一般的な規則としてではなく、その時にのみ使用すべきです。 – leinir

0

おそらくありません。 Qt-メタオブジェクトコンパイラ(moc)は、関数がラップされ、スロット-sと比較的大きなコードラッパーでマークされています。 mocで作成されたファイルは、で始まり、moc_となります。

4

を参照してください。 http://qt-project.org/wiki/New_Signal_Slot_Syntax

Qt 4では、これは直接サポートされていませんが、非スロット機能を呼び出す非表示のQObjectのスロットを介して信号をプロキシすることによってこの機能を提供するライブラリがいくつかあります。私の試みはhttps://github.com/robertknight/qt-signal-toolsです。 READMEの最後には他の実装へのリンクがあります。

8

Qt 5以降では、ファンクタとラムダ式はスロットとして使用できます(前述のとおり、http://qt-project.org/wiki/New_Signal_Slot_Syntax)。

Iは、サンプルコードを見つけることができなかったとして、私は、次の追加:

この例では、パラメータを指定せずにクラスメンバーClassName::classMember()ためboost::functionを使用します。

boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1); 
ブースト::バインドに

詳細情報に見出すことができる:Qtの信号とクラス部材(例えばClassName::classMember(int)ための)パラメータを有する場合は、次のよう

boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance); 
    connect(QObjectInstance, &QObject::signalName, f); 

、ブースト機能が適応されるべきですドキュメント:http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html

関連する問題