Система сигналов/слотов 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, используя строку с его именем. Если бы я мог генерировать сигнал, используя этот идентификатор, мой код стал бы намного чище.
Я взглянул на реализацию метода сигнала, сгенерированную moc
, и похоже, что единственное, что отличается от одного сигнала к другому, это одна цифра:
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
, так как он выглядит скрытым в приватных заголовках?