【发布时间】:2013-10-11 12:58:54
【问题描述】:
我有一个 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(int) 中更改MyLibEvent2(mylib::MyLibType) 一切正常......
【问题讨论】:
-
可能 event2() 永远不会被调用?
-
event2被执行并调用emit MyLibEvet2(i)但OnMyLibEvet2从未被调用 -
另一个奇怪的是Qt在输出窗口上打印:
pc 0x400 in read in psymtab, but not in symtab. -
我偶然发现的一件事是
connect不检查大小写或拼写。所以要特别确保没有大小写不匹配或缺少字符。编译器不会抱怨,但你的函数不会被调用 -
IEvent 的一个参数是 typedef。可能是这个问题吗?
标签: c++ qt4 qt5 publish-subscribe