Qt连接不起作用



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

您需要将数据类型注册到 QT 元类型系统才能使其正常工作:

qRegisterMetaType<mylib::MyLibType>();

QT的元类型系统不知道typedefs,因此不知道如何传输mylib::MyLibType。如果你也需要Q_DECLARE_METATYPE(mylib::MyLibType),我并不完全是舒尔,如果你没有成功,就试试吧。

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

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

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

相关内容

  • 没有找到相关文章

最新更新