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
または、プライベート ヘッダーに埋もれているように見えるため、少なくとも を呼び出す機会を得ますか?