2016-04-09 6 views
0

すべてのカスタム(ベースクラスから継承されていない)スロットと信号のリストを取得したいと思います。これも可能ですか?それとも手動で行う必要がありますか?Qt - クラス内のすべてのカスタムスロットと信号のリストを取得する方法はありますか?

一般に、スロット/シグナルは名前(const *)を持っています。実際には、これらの名前を使用して特定のスロット信号接続を確立/削除する機能に引数として渡すことができます。

QGraphicsProxyWidgetの入力(スロット)と出力(信号)を表すQGraphicsItemの束を自動的に生成したいのです。これらの入力と出力は、他のそのようなノード(プロキシウィジェット+入力+出力)に接続するためのものです。そうすることで、新しいカスタムノードを追加するほうがずっと簡単になります。

+0

クラスとその親クラスのスロットを取得し、見つけます差? – hyde

+0

特殊なスロットに特別な名前を付けることができます。クラスのスロットを確認し、名前が一致するものを選ぶだけです。 – hyde

+0

スロット/信号を取得するにはどうすればよいですか?私は、スロット/シグナルは全ての関数の後にあります(信号には開発者が提供する実装はありませんが)。クラスは通常スロット/シグナルに指定されたもの以外の関数を持っています。 – rbaleksandar

答えて

5

これにはQMetaObjectを使用できます。

QMetaMethod method(int index) const 
int methodCount() const 

を用いた方法を反復し、QMetaMethod

MethodType QMetaMethod::methodType() const 

MethodTypeこの方法(信号、スロット、又は方法)のタイプを返しチェック。

編集:あなたは

int QMetaObject::methodOffset() const 

は、このクラスのオフセットメソッドを返します使用したい場合があり

。つまりこのクラスの最初のメンバ関数のインデックス位置です。

基本クラスのメソッドをスキップする。


例:(完全な答えのための@rbaleksandarから)

指定されたクラスMyClassのために行う:

MyClass test; 

QMetaObject *moTest = test.metaObject(); 

QList<QString> slotSignatures; 
QList<QString> signalSignatures; 

// Start from MyClass members 
for(int methodIdx = moTest->methodOffset(); methodIdx < moTest->methodCount(); ++methodIdx) { 
    QMetaMethod mmTest = moTest->method(methodIdx); 
    switch((int)mmTest.methodType()) { 
    case QMetaMethod::Signal: 
     signalSignatures.append(QString(mmTest.methodSignature())); // Requires Qt 5.0 or newer 
     break; 
    case QMetaMethod::Slot: 
     slotSignatures.append(QString(mmTest.methodSignature())); // Requires Qt 5.0 or newer 
     break; 
    } 
} 

// Just to visualize the contents of both lists 
cout << "Slots:" << endl; 
foreach(QString signature, slotSignatures) cout << "\t" << signature.toStdString() << endl; 
cout << "Signals:" << endl; 
foreach(QString signature, signalSignatures) cout << "\t" << signature.toStdString() << endl; 
+0

ああ、うわー!そのような特徴があります。甘い。情報をありがとう。すぐにテストされます。 – rbaleksandar

+1

継承されたものをスキップしたいので、 'methodOffset'に関する情報を追加してください。 – Thomas

+0

答えにいくつかのコードを追加しても構いません。どうもありがとう!本当に役に立つ情報です。 – rbaleksandar