信号槽自定义结构问题

时间:2018-06-27 11:58:50

标签: c++ qt signals slot

我在将自己的结构从信号发送到插槽时遇到问题。结构如下:

WorldObjectChange.h

#pragma once

    struct WorldObjectChange  {
        WorldObjectChange() {}
        ~WorldObjectChange() {}
        double x;
    };        
    Q_DECLARE_METATYPE(WorldObjectChange)

我叫qRegisterMetaType以便在信号插槽方法中知道类型

main.c

QApplication a(argc, argv); 
qRegisterMetaType<WorldObjectChange>();

由于信号和插槽占用不同的线程,因此连接处于排队状态。 连接发生在初始化并启动object1线程的类的构造函数中。

InitClass::InitClass(Object2 *object2) {
  Object1* object1 = new Object1();
  connect(object1, SIGNAL(updateObjects(WorldObjectChange)), object2, SLOT(updateObjects(WorldObjectChange)));
}

object1.h

#include "WorldObjectChange.h"

class object1 : public QObject{
    Q_OBJECT
    public:
        object1();
    public signals:
        void updateObjects(WorldObjectChange);
};

object2.h

#include "WorldObjectChange.h"

class object2: public QLabel {
    Q_OBJECT

public:
    explicit object2(QWidget * parent = 0);
    public slots:
        void updateObjects(WorldObjectChange worldChangeVector);
};

object2.cpp

void updateObjects(WorldObjectChange worldChangeVector) { }

该对象似乎在object1中工作正常,但是每当我在对象2中添加插槽的行时,都会出现以下错误:

  

错误LNK2019无法解析的外部符号“ public:无效__cdecl   worldOutputGrid :: updateObjects(struct WorldObjectChange)“   (?updateObjects @ worldOutputGrid @@ QEAAXUWorldObjectChange @@@ Z)   在函数“私有:静态void __cdecl中引用”   worldOutputGrid :: qt_static_metacall(类QObject *,枚举   QMetaObject :: Call,int,void * *)“   (?qt_static_metacall @ worldOutputGrid @@ CAXPEAVQObject @@ W4Call @ QMetaObject @@ HPEAPEAX @ Z)

预先感谢您的帮助

1 个答案:

答案 0 :(得分:0)

connect采用QObject*,因为它是第1 st 和3 rd 参数。在您的代码中:

connect(object1, SIGNAL(updateObjects(WorldObjectChange)), object2, SLOT(updateObjects(WorldObjectChange)));

object1不是QObject*。您需要改用:

connect(&object1, SIGNAL(updateObjects(WorldObjectChange)), object2, SLOT(updateObjects(WorldObjectChange)));