2013-10-11 9 views
0

저는 C++ 라이브러리를 가지고 있습니다. 이 라이브러리는 publish-subscriber 패턴을 사용합니다.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))); 
} 

나는() QtMyApplication 내에서 호출 되나 OnMyLibEvent2 호출되지 않습니다 응용 프로그램 event2을 실행

대신합니다 Event1()라고하며 OnMyLibEvent1이 너무이라고합니다. 내가 잘못 했나요? 인수 매개 변수가 문제입니까?

편집 한

은 내가 MyLibEvent2(int)MyLibEvent2(mylib::MyLibType)을 변경하면 모두가 제대로 작동하기 때문에 연결이

+0

으로 업데이트하기로 결정한 경우 event2()가 호출되지 않습니다. – codeling

+0

'event2'가 실행되고'emit MyLibEvet2 (i)'를 호출하지만'OnMyLibEvet2'는 절대 호출되지 않습니다 –

+0

또 다른 이상한 점은 Qt가 출력한다는 것입니다 : 출력 창에'pc 0x400 in psymtab, symtab에는 없습니다 .' –

답변

1

당신은 당신의 데이터 유형을 등록해야 ... ... PARAMS에 대한 몇 가지 제한이 있다는 것을 발견

qRegisterMetaType<mylib::MyLibType>(); 

QTS 메타 타입 시스템은 형식 정의에 대해 알고하지 않으며, 따라서 MYLIB :: MyLibType를 전송하는 방법을 알고하지 않습니다 QTS 메타 타입 시스템은 작동하게합니다. Q_DECLARE_METATYPE(mylib::MyLibType)도 필요하다면 정확히 shure가 아닙니다. 성공하지 못하면 시도해보십시오.

QT5의 새 연결 구문을 사용하는 경우 추가 작업 없이도 작동 할 수 있습니다.

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

문제는 이전 연결 구문이 메타 데이터 시스템과 문자열 비교를 처리하고 있으며 매우 취약하다는 것입니다. 또한 슬롯을 void OnMyLibEvent2(::mylib::MyLibType)

관련 문제