2013-10-11 2 views
0

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

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) все работает правильно ...

+0

возможно, событие2() никогда не называется? – codeling

+0

Выполняется 'event2', и он вызывает' emit MyLibEvet2 (i) ', но' OnMyLibEvet2' никогда не называется –

+0

еще одна странная вещь: Qt печатает: 'pc 0x400 в read в 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)

Смежные вопросы