【发布时间】:2018-12-06 07:38:03
【问题描述】:
我在将自己的结构从信号发射到插槽时遇到问题。该结构如下所示:
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) { }
对象在对象 1 中似乎工作正常,但是每当我在对象 2 中添加插槽的行时,我都会收到以下错误:
错误 LNK2019 未解析的外部符号“public: void __cdecl worldOutputGrid::updateObjects(struct WorldObjectChange)" (?updateObjects@worldOutputGrid@@QEAAXUWorldObjectChange@@@Z) 在函数“private: static void __cdecl”中引用 worldOutputGrid::qt_static_metacall(类 QObject *,枚举 QMetaObject::Call,int,void * *)" (?qt_static_metacall@worldOutputGrid@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z)
提前感谢您的帮助
【问题讨论】:
-
函数
object2::updateObjects()有定义吗? -
WorldObjectChange没有成员:y、width或height。你显然必须修复它才能编译。如果这解决了您的问题,我可以将其作为答案发布,但我认为修复这将有助于我们解决实际问题。 -
忘记删除参数,object2中的定义存在。在问题中更改了它
-
OK 下一个问题,
connect发生在哪里?您没有在updateObjects上指定类,所以我假设您的信号和插槽都使用信号或插槽的定义。 -
链接器错误表明 worldOutputGrid 命名空间或类.. 你的代码在哪里?