Russian Qt Forum

Qt => Общие вопросы => Тема начата: dr_Begemot от Апрель 15, 2009, 14:42



Название: Некоторые особенности connect
Отправлено: dr_Begemot от Апрель 15, 2009, 14:42
При работе с connect-ом столкнулся с таким багом:
есть некоторый набор enum-ов описанный так:
Код:
namespace MyNamespace{
  enum Type{
    Type1,
    Type2,
    Type3
  };
}//end namespace

Дальше есть сигнал my_signal(Type type); и есть слот my_slot(Type type);

когда сигнал со слотом соединяю таким образом:
bool ok = connect(obj1, SIGNAL(my_signal(Type)), obj2, SLOT(my_slot(Type)) );

то все работает и ok = true, а если так:
bool ok = connect(obj1, SIGNAL(my_signal(MyNamespace::Type)), obj2, SLOT(my_slot(MyNamespace::Type)) );

то ok=false и соответственно ничего не работает...
в Output пишет что нет такого сигнала...

В чем загвоздка?


Название: Re: Некоторые особенности connect
Отправлено: Авварон от Апрель 15, 2009, 14:56
в коннекте не работает указание области видимости. Фактически, SIGNAL и SLOT переводят свои аргументы в строку - "my_signal(Type)". То же делается при объявлении сигналов и слотов. Более того, оно отказывается обрабатывать сигналы/слоты вида my_signal(Type t). Идет точно сравнение строк (по хэш-таблице) и указание области видимости поганит строку. Больше всего это раздражает при наследовании (когда объявляешь слот с тем же именем и до исходного добраться нет возможности)


Название: Re: Некоторые особенности connect
Отправлено: pastor от Апрель 15, 2009, 15:04
Я думаю, здесь может помочь qRegisterMetaType

qRegisterMetaType<MyNamespace::Type>();
connect(obj1, SIGNAL(my_signal(MyNamespace::Type)), obj2, SLOT(my_slot(MyNamespace::Type)) );