Qt 5 No such signal
Разрабатывается приложение, которое будет чем-то вроде панели управления. К устройству подключается джойстик и далее по алгоритму. На текущем этапе, для тестирования, пытаюсь вывести значения осей на поля интерфейса. Получение данных от usb решил вынести в отдельный поток, оформил класс под это дело, закинул в joyhid.h:
#ifndef JOYHID_H
#define JOYHID_H
#include <QObject>
#include <cstdint>
#include "hidapi.h"
typedef struct _HID_JOYSTK_Info
{
uint16_t X;
uint16_t Y;
uint16_t Z;
uint16_t X_low;
uint16_t Y_low;
uint8_t buttons[5];
}
HID_JOYSTK_Info_TypeDef;
class JoyHID : public QObject
{
Q_OBJECT
public:
explicit JoyHID(QObject *parent = nullptr);
public slots:
void joySlot();
signals:
void joySignal(HID_JOYSTK_Info_TypeDef *obj);
private:
void joyHIDUpdate(HID_JOYSTK_Info_TypeDef *obj);
};
#endif // JOYHID_H
Прописал слоты, сигналы, структура предназначается для хранения и дальнейшего использования. В mainwindow.h добавил слот для приема сигнала от класса джойстика:
public slots:
void uiSlot(HID_JOYSTK_Info_TypeDef *obj);
В mainwindow.cpp пытаюсь это все заставить работать следующим образом:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QThread *joy_thread = new QThread;
JoyHID *joystck = new JoyHID;
joystck->moveToThread(joy_thread);
connect(joystck, SIGNAL(joySignal(HID_JOYSTK_Info_TypeDef)), this, SLOT(uiSlot(HID_JOYSTK_Info_TypeDef)));
connect(joy_thread, SIGNAL(started()), joystck, SLOT(joySlot()));
joy_thread->start();
}
Проект собирается и запускается, но во время запуска, в консоли, вижу вот это:
QObject::connect: No such signal JoyHID::joySignal(HID_JOYSTK_Info_TypeDef) in ..\display\mainwindow.cpp:15
QObject::connect: (receiver name: 'MainWindow')
И никак до меня не может дойти, в чем тут проблема. До этого пару раз ошибался с сигнатурами, либо что-то забывая, либо просто опечатываясь, однако здесь что-то иное, буду рад услышать от знающих, в чем может быть проблема
Ответы (1 шт):
У вас тип параметра в сигнале HID_JOYSTK_Info_TypeDef *, а вы написали HID_JOYSTK_Info_TypeDef.
Для избежания таких ошибок лучше используйте "новый" (в кавычках потому что он появился без малого 10 лет назад) синтаксис соединения, он осуществляет проверку сигнатур в компайлтайме, а не в рантайме как старый:
connect(joystck, &JoyHID::joySignal, this, &MainWindow::uiSlot);