2016-08-29 27 views
4

スロット(slotsセクションで宣言されたメソッド)とQtのメソッド(Q_INVOKABLEキーワードで宣言されたメソッド)の違いは何ですか?どちらもQMetaObject::invokeMethodを使用して呼び出すことができますが、SLOTマクロを使用してスロットに接続すると、両方とも受け入れられますが、メタメソッドのタイプを取得すると、QMetaMethod::MethodまたはQMetaMethod::Slotのいずれかが返される可能性があります。Qtのスロットとメソッドの違いは何ですか?

答えて

9

唯一の違いは、メソッドがクラスのメタデータにスロットとして表示されているのかスロットに表示されていないのかです。両方のQt 4とQt 5において、スロット又は呼び出し可能ないずれかへの接続が成功:

#include <QObject> 
struct Test : public QObject { 
    Q_SLOT void slot() {} 
    Q_INVOKABLE void invokable() {} 
    Q_OBJECT 
}; 

int main() { 
    Test test; 
    auto c1 = QObject::connect(&test, SIGNAL(destroyed(QObject*)), &test, SLOT(slot())); 
    auto c2 = QObject::connect(&test, SIGNAL(destroyed(QObject*)), &test, SLOT(invokable())); 
    Q_ASSERT(c1); 
    Q_ASSERT(c2); 
} 
#include "main.moc" 

それがスロットと呼び出し可能な差が解釈される方法を決定するユーザ次第です。例えば。何らかの方法でスロットリストをユーザーに公開している場合は、そうしない限り、呼び出し可能なメソッドリストが表示されません。

関連する問題