正在开发一个类似于控制面板的应用程序。操纵杆连接到设备并进一步根据算法。在当前阶段,为了测试,我正在尝试在界面的字段上显示轴的值。我决定将数据从 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')
而且我无法弄清楚问题是什么。在此之前,我在签名时被弄错了几次,要么忘记了什么,要么只是打字,但这里有一些不同,我很高兴听到那些知道问题可能是什么的人
您在信号中有参数类型
HID_JOYSTK_Info_TypeDef *
,并且您编写了HID_JOYSTK_Info_TypeDef
。为避免此类错误,最好使用“新”(在引号中,因为它出现在将近 10 年前)连接语法,它在编译时检查签名,而不是像旧的那样在运行时检查签名: