У меня есть библиотека 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
Я обнаружил, что соединение имеет некоторые ограничения на params.... потому что, если я изменяю MyLibEvent2(mylib::MyLibType)
в MyLibEvent2(int)
все работает правильно...
Вам необходимо зарегистрировать свой тип данных в системе метатипа QT, чтобы он работал:
qRegisterMetaType<mylib::MyLibType>();
Система метатипа QTs не знает о typedefs и поэтому не знает, как передать mylib :: MyLibType. Я не совсем уверен, если вам нужен Q_DECLARE_METATYPE(mylib::MyLibType)
, попробуйте, если у вас нет успеха.
Если вы используете синтаксис нового соединения QT5s, то он также может работать без каких-либо дополнительных усилий.
connect( this, &QtMyApplication::MyLibEvent2,
this, &QtMyApplication::OnMyLibEvent2);
Проблема в том, что старый синтаксис соединения работает вокруг системы метаданных и сравнения строк и довольно хрупкий. Он также не будет работать, если вы решите обновить свой слот до void OnMyLibEvent2(::mylib::MyLibType)