我在将自己的结构从信号发射到插槽时遇到问题。结构如下所示:
WorldObjectChange.h
#pragma once
struct WorldObjectChange {
WorldObjectChange() {}
~WorldObjectChange() {}
double x;
};
Q_DECLARE_METATYPE(WorldObjectChange)
我调用 qRegisterMetaType 以使信号槽方法中的类型已知
主.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)));
}
对象1.h
#include "WorldObjectChange.h"
class object1 : public QObject{
Q_OBJECT
public:
object1();
public signals:
void updateObjects(WorldObjectChange);
};
对象2.h
#include "WorldObjectChange.h"
class object2: public QLabel {
Q_OBJECT
public:
explicit object2(QWidget * parent = 0);
public slots:
void updateObjects(WorldObjectChange worldChangeVector);
};
对象2.cpp
void updateObjects(WorldObjectChange worldChangeVector) { }
该对象在对象 1 中似乎工作正常,但是每当我在对象 2 中为插槽添加行时,我都会收到以下错误:
错误LNK2019未解析的外部符号"public: void __cdecl worldOutputGrid::updateObjects(struct WorldObjectChange(" (?updateObjects@worldOutputGrid@@QEAAXUWorldObjectChange@@@Z( 在函数"私有:静态空隙__cdecl"中引用 worldOutputGrid::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *(" (?qt_static_metacall@worldOutputGrid@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z(
提前感谢您的帮助
connect
采用QObject*
,因为它是第 1 个和第 3个参数。在您的代码中:
connect(object1, SIGNAL(updateObjects(WorldObjectChange)), object2, SLOT(updateObjects(WorldObjectChange)));
object1
不是QObject*
.您需要改用:
connect(&object1, SIGNAL(updateObjects(WorldObjectChange)), object2, SLOT(updateObjects(WorldObjectChange)));