我有一个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)) );
}
当我运行应用程序时,在QtMyApplication内部调用event2(),但从不调用OnMyLibEvent2,而是调用event1(),并且也调用OnMyLibEvent1。
我怎么了参数参数是问题吗?
编辑1
我发现连接对参数有一些限制....因为如果在
MyLibEvent2(mylib::MyLibType)
中更改MyLibEvent2(int)
,则所有功能都可以正常工作... 最佳答案
您需要将数据类型注册到QTs元类型系统以使其工作:
qRegisterMetaType<mylib::MyLibType>();
QT的元类型系统不了解typedef,因此不知道如何传输mylib :: MyLibType。
如果您也需要
Q_DECLARE_METATYPE(mylib::MyLibType)
,我也不是很确定,如果没有成功,请尝试一下。如果您使用QT5的新连接语法,那么它也可能无需任何额外的努力即可工作。
connect( this, &QtMyApplication::MyLibEvent2,
this, &QtMyApplication::OnMyLibEvent2);
问题是旧的connect语法在元数据系统和字符串比较中起作用,并且相当脆弱。如果您决定将广告位更新为
void OnMyLibEvent2(::mylib::MyLibType)
,它也将不起作用关于c++ - Qt连接不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19318759/