2

Qt シグナル/スロット システムはうまく動作しますが、実際に役立つ機能がいくつか欠けているようです (または、少なくとも使用方法がわかりません)。多くのシグナルを持つクラスがあり、このクラスにはswitch、変数の値に応じて適切なシグナルを発する必要がある があります。今、私はCプリプロセッサを使用してこれを解決します:

#define CASE(_NAME) \    
case MyEnum_ ## _NAME: \
{ \
    emit MySignal_ ## _NAME(); \
    do_other_stuff(); \
    break; \
}

switch(val)
{
CASE(Val_1)
CASE(Val_2)
CASE(Val_3)
}

これは正しく見えません。もっとエレガントな方法があると確信しています。QMetaObject名前付きの文字列を使用してindexOfSignal、シグナルのQtの内部IDを取得できるメソッドがあります。この ID を使用してシグナルを発信できれば、私のコードはずっときれいになります。

によって生成されたシグナル メソッドの実装をのぞいてみたところ、シグナルmocごとに異なるのは 1 桁だけのようです。

void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, <signal_id>, _a);

ここで、<signal_id>は信号ごとに一意の整数です。

それで、問題は、どうすればいいemit(int signalIdx)ですか?QMetaObject::activateまたは、プライベート ヘッダーに埋もれているように見えるため、少なくとも を呼び出す機会を得ますか?

4

2 に答える 2

7

QMetaObject::invokeMethodを使用する

私は自分のプログラムでこれを使用しています:

mCallerはスロットが定義されたオブジェクトでmSlotNameあり、スロットの名前です

QMetaObject::invokeMethod(mCaller, mSlotName.toLatin1().constData(), Qt::DirectConnection)
于 2015-02-27T10:53:26.683 に答える
2

より良いオプションですがQMetaObject::invokeMethod()、数値だけでシグナルを発することも可能です:emit p->metaObject()->method(n).invoke(...);

于 2015-02-27T12:27:15.357 に答える