【问题标题】:signal slot custom struct issue信号槽自定义结构问题
【发布时间】: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 没有成员:ywidthheight。你显然必须修复它才能编译。如果这解决了您的问题,我可以将其作为答案发布,但我认为修复这将有助于我们解决实际问题。
  • 忘记删除参数,object2中的定义存在。在问题中更改了它
  • OK 下一个问题,connect 发生在哪里?您没有在 updateObjects 上指定类,所以我假设您的信号和插槽都使用信号或插槽的定义。
  • 链接器错误表明 worldOutputGrid 命名空间或类.. 你的代码在哪里?

标签: c++ qt signals slot


【解决方案1】:

connect 采用 QObject* 作为 1st 和 3rd 参数。在您的代码中:

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

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

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

【讨论】:

  • 对不起,当我编辑代码时,我忘记了我正在使用动态初始化。我在问题中更改了它。
  • @todayihateprogramming 在这种情况下,这应该可以工作。还有其他事情正在进行中,以弄清楚实际构建玩具示例需要什么。然后你会发现那里没有问题。接下来的工作是向后拼接你的东西,看看你的实际问题在哪里。
猜你喜欢
  • 2011-10-29
  • 2020-10-01
  • 2017-02-06
  • 1970-01-01
  • 2013-01-10
  • 2020-10-22
  • 2020-10-05
  • 1970-01-01
相关资源
最近更新 更多