我有一个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(mylib::MyLibType)中更改MyLibEvent2(int),则所有功能都可以正常工作...

最佳答案

您需要将数据类型注册到QTs元类型系统以使其工作:

qRegisterMetaType<mylib::MyLibType>();


QT的元类型系统不了解typedef,因此不知道如何传输mylib :: MyLibType。
如果您也需要Q_DECLARE_METATYPE(mylib::MyLibType),我也不是很确定,如果没有成功,请尝试一下。

如果您使用QT5的新连接语法,那么它也可能无需任何额外的努力即可工作。

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


问题是旧的connect语法在元数据系统和字符串比较中起作用,并且相当脆弱。如果您决定将广告位更新为void OnMyLibEvent2(::mylib::MyLibType),它也将不起作用

关于c++ - Qt连接不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19318759/

10-11 15:41