Qt Connect не работает

У меня есть библиотека C ++. Эта библиотека использует шаблон публикация-подписчик.

namespace mylib {
typedef unsigned MyLibType;
class IEvent
{
virutal ~IEvent() {}

virtual void event1() = 0;
virtual void event2(MyLibType) = 0;
};

class IMyClass
{
public:
virtual ~IMyClass() {}

// operations
};

} // mylib

// C interface
int CreateMyClass( mylib::IMyClass** class, mylib::IEvent* listener );

// implementation
class MyClass : public IMyClass { // ...

Когда MyClass создает, использует поток, который генерирует некоторые события.

Теперь на Qt:

class QtMyApplication : public QMainWindow, public mylib::IEvent
{
Q_OBJECT

public:
explicit QtMyApplication(QWidget *parent = 0);
~QtMyApplication();

signals:
void MyLibEvent1();
void MyLibEvent2(mylib::MyLibType);

private slots:
void OnMyLibEvent1();
void OnMyLibEvent2(mylib::MyLibType);

private: // IEvent interface
void event1()
{
emit MyLibEvent1();
}

void event2(mylib::MyLibType i)
{
emit OnMyLibEvent2( i );
}

private:
Ui::QtMyApplication* ui;
mylib::IMyLib mMyLib;
};

// implementation
QtMyApplication::QtMyApplication( QWidget *parent ) :
QMainWindow(parent),
ui(new Ui::QtMyApplication)
{
ui->setupUi( this );

CreateMyLib( &mMyLib, this );

connect( this, SIGNAL(MyLibEvent1()),
this, SLOT(OnMyLibEvent1()) );
connect( this, SIGNAL(MyLibEvent2(mylib::MyLibType)),
this, SLOT(OnMyLibEvent2(mylib::MyLibType)) );
}

Когда я запускаю приложение, вызывается event2 () внутри QtMyApplication, но OnMyLibEvent2 никогда не вызывается, вместо этого вызывается event1 () и также вызывается OnMyLibEvent1.
Что я не прав? Является ли параметр аргумента проблемой?

редактировать 1

Я обнаружил, что соединение имеет некоторые ограничения на параметры …. потому что, если я изменю MyLibEvent2(mylib::MyLibType) в MyLibEvent2(int) все работает нормально …

0

Решение

Вам нужно зарегистрировать свой тип данных в системе метатипов QTs, чтобы он работал:

qRegisterMetaType<mylib::MyLibType>();

Система метатипов QTs не знает о typedefs и, следовательно, не знает, как передать mylib :: MyLibType.
Я не совсем уверен, если вам нужно Q_DECLARE_METATYPE(mylib::MyLibType) тоже, попробуйте, если у вас нет успеха.

Если вы используете новый синтаксис соединения QT5, то он также может работать без каких-либо дополнительных усилий.

connect( this, &QtMyApplication::MyLibEvent2,
this, &QtMyApplication::OnMyLibEvent2);

Проблема заключается в том, что старый синтаксис соединения работает вокруг системы метаданных и сравнения строк и является довольно хрупким. Это также не будет работать, если вы решите обновить свой слот до void OnMyLibEvent2(::mylib::MyLibType)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]