QWidgetからクラスを継承せずに、QtスロットとしてC++関数を使用する方法はありますか?QtスロットとしてのC++関数の使用
答えて
あなたはできないのQtのバージョンで<のQt 5
メタオブジェクトコンパイラが呼び出されなければなら信号/スロットを使用するために。
QObject
から継承やその他のサブクラス(例えばQWidget
、QPushButton
など)Q_OBJECT
マクロが順にクラスのプライベートセクションで定義されている必要があり- :これはあなたのクラスには、次の要件を満たしている必要があります実現するためにそのようなスロットとしてメタオブジェクトの機能を有効にする
- 使用スロットまたは信号
Qt
キーワード
slots
と
signals
詳細については
もQObject
マニュアルを確認とsignals & slots
約対応する文書ページをチェック:
Q_OBJECT
マクロ信号、スロットまたはを実装する任意のオブジェクトのために必須であることに注意してくださいプロパティ。また、ソースファイルで Meta Object Compilerを実行する必要があります。 に失敗すると、特定の関数が奇妙な動作をする可能性があるため、 が実際にシグナル、スロット、およびプロパティを使用しないかどうかにかかわらず、このマクロの をQObjectのすべてのサブクラスで使用することを強くお勧めします。
編集:Qt 5以降では、ファンクタとラムダ式をスロットとして使用できます。 New Signal Slot Syntax in Qt 5
しかし、これはQt 4では不可能ですが、 Qt 5で可能になるためには、新しい信号/スロット機構を使用して。 http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir
あなたは正しいですが、IMHOはごくまれにしか使用しないでください。スロットを使うことは、単純な関数でtr1 :: bindを使うよりもエレガントです。 – pnezis
私はまったく同意する、彼らはまれな発生でなければならない。短い文章のif文とよく似ていますが、それらは非常に狭い一連の状況で役に立ち、そのような場合には読みやすさとメンテナンスの容易さが向上します。しかし、それらは一般的な規則としてではなく、その時にのみ使用すべきです。 – leinir
おそらくありません。 Qt-メタオブジェクトコンパイラ(moc)は、関数がラップされ、スロット-sと比較的大きなコードラッパーでマークされています。 mocで作成されたファイルは、で始まり、moc_となります。
QObjectのを継承するために十分である:http://qt-project.org/doc/qt-4.8/signalsandslots.html
を参照してください。 http://qt-project.org/wiki/New_Signal_Slot_Syntax
Qt 4では、これは直接サポートされていませんが、非スロット機能を呼び出す非表示のQObjectのスロットを介して信号をプロキシすることによってこの機能を提供するライブラリがいくつかあります。私の試みはhttps://github.com/robertknight/qt-signal-toolsです。 READMEの最後には他の実装へのリンクがあります。
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
- 1. Qtのスロット
- 2. Qtシグナル/スロットとスレッド
- 3. Qtのスロットとクラスinheritation
- 4. 信号とスロット、Qtのデザインパターン?
- 5. QtのQMLスロットへのC++信号
- 6. boost :: signals2スロットを非静的関数メンバーとして使用しますか?
- 7. Qtデザイナを使用したQtプッシュボタンイベント:「このスロットQApplicationはありません」
- 8. Qtのシグナルとスロット、スレッド、(app.exec)、および関連するクエリ
- 9. 初心者のQtシグナルとスロット質問
- 10. フォーム間のQt信号とスロット
- 11. 関数へのパラメータとしてQt 5の新信号スロット構文を宣言する方法
- 12. テンプレート関数をパラメータとして使用するC++テンプレート関数
- 13. Qtスロットの引数が壊れています
- 14. のQt:スタイルに関する信号/スロットは、
- 15. QTとC++を使用して関数に文字列引数を渡す方法
- 16. Qtとvariadic関数
- 17. 関数()Qtの
- 18. Qtのは、そのようなスロット
- 19. シグナル/スロット対ダイレクト関数呼び出し
- 20. Qt:スレッドとシグナル/スロットを使用しているときにGUIがフリーズすることがある
- 21. Qt C++を使用してグローバルQHash変数を作成
- 22. Qtはboost :: shared_ptrの信号とスロットを接続します
- 23. Qtoolbuttonを使用した信号とスロット
- 24. [ネイティブ]:Android用QtでJava関数とサードパーティライブラリを使用する
- 25. Qtの2つのプラグインのシグナル/スロットの相互作用
- 26. 客観CでC関数を宣言して使用して
- 27. Qtでのモデル信号 - スロット接続
- 28. C#の代理人をC DllImported関数のコールバックとして使用
- 29. テンプレート関数をクラス関数の戻り値として使用
- 30. Qt信号とスロットの接続が動作していないようです。
重複しているかどうかわかりませんが、これは役立ちます:http://stackoverflow.com/questions/8533906/ –