2013-10-11 201 views
0

我有一个C++库。该库使用发布订户模式。Qt连接不起作用

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))); 
} 

当我运行应用程序事件2()被调用内部QtMyApplication但OnMyLibEvent2不会被调用,而不是事件1()被调用,OnMyLibEvent1叫过。 我错了什么?参数参数是否是问题?

编辑1

我发现连接对PARAMS一些限制....因为如果我在MyLibEvent2(int)改变MyLibEvent2(mylib::MyLibType)一切工作正常...

+0

可能event2()永远不会被调用? – codeling

+0

'event2'被执行,它调用'发出MyLibEvet2(i)'但'OnMyLibEvet2'永远不会被调用 –

+0

另一个奇怪的事情是Qt打印:'pc 0x400在psymtab中读取,在symtab中读取不在输出窗口 –

回答

1

您需要将您的数据类型注册QTS元类型系统,使其工作:

qRegisterMetaType<mylib::MyLibType>(); 

QTS元类型系统不知道类型定义,因此不知道如何转移MYLIB :: MyLibType。 如果您还需要Q_DECLARE_METATYPE(mylib::MyLibType),我不完全确定,如果您没有成功,请尝试。

如果您使用QT5s新的连接语法,那么它也可能没有任何额外的工作。

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

问题是旧的连接语法正在解决元数据系统和字符串比较问题,并且相当脆弱。它也不会工作,如果你决定更新你的插槽void OnMyLibEvent2(::mylib::MyLibType)