проблема пользовательской структуры сигнального слота - PullRequest
0 голосов
/ 27 июня 2018

У меня проблемы с передачей собственной структуры из сигнала в слот. Структура выглядит следующим образом:

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: void __cdecl worldOutputGrid :: updateObjects (struct WorldObjectChange) " (? UpdateObjects @ worldOutputGrid @@ QEAAXUWorldObjectChange @@@ Z) упоминается в функции "private: static void __cdecl worldOutputGrid :: qt_static_metacall (класс QObject *, enum QMetaObject :: Call, int, void * *) " (? Qt_static_metacall @ worldOutputGrid @@ CAXPEAVQObject @@ W4Call @ QMetaObject @@ HPEAPEAX @ Z) * ​​1026 *

Заранее спасибо за помощь

1 Ответ

0 голосов
/ 27 июня 2018

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)));
...