Qt Connect не работает

0

У меня есть библиотека 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)) );
}

Когда я запускаю приложение event2(), вызывается внутри QtMyApplication, но OnMyLibEvent2 никогда не вызывается, вместо этого вызывается event1() и вызывается OnMyLibEvent1. Что я не так? Является ли параметр параметра проблемой?

изменить 1

Я обнаружил, что соединение имеет некоторые ограничения на params.... потому что, если я изменяю MyLibEvent2(mylib::MyLibType) в MyLibEvent2(int) все работает правильно...

Теги:
qt5
publish-subscribe
qt4

1 ответ

1
Лучший ответ

Вам необходимо зарегистрировать свой тип данных в системе метатипа QT, чтобы он работал:

qRegisterMetaType<mylib::MyLibType>();

Система метатипа QTs не знает о typedefs и поэтому не знает, как передать mylib :: MyLibType. Я не совсем уверен, если вам нужен Q_DECLARE_METATYPE(mylib::MyLibType), попробуйте, если у вас нет успеха.

Если вы используете синтаксис нового соединения QT5s, то он также может работать без каких-либо дополнительных усилий.

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

Проблема в том, что старый синтаксис соединения работает вокруг системы метаданных и сравнения строк и довольно хрупкий. Он также не будет работать, если вы решите обновить свой слот до void OnMyLibEvent2(::mylib::MyLibType)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню