一、文件描述
ControlPanel.h
#ifndef __CONTROLPANEL
#define __CONTROLPANEL
#include <thread>
#include <iostream>
#include <QObject>
#include "DataTrans.h"
class ControlPanel : public QObject
{
Q_OBJECT
public:
ControlPanel();
private:
void WriteMsg();
void ReadMsg();
signals:
void testSignal(ControlPanelCommand controlPanelCommand);
private:
DataTrans<ControlPanelCommand> Trans;
};
#endif
构造函数:
ControlPanel::ControlPanel()
{
std::thread writeMsgThread(&ControlPanel::WriteMsg, this);
std::thread readMsgThread(&ControlPanel::ReadMsg, this);
writeMsgThread.detach();
readMsgThread.detach();
}
发射信号
emit testSignal(controlPanelCommand);
connect信号与槽:
connect(controlPanel, &ControlPanel::testSignal, pGainSlider, [=](ControlPanelCommand command){
std::cout << command.value << std::endl;
int GainSliderValue = pGainSlider->value();
if (GainSliderValue < pGainSlider->maximum()) {
pGainSlider->setValue(GainSliderValue+1);
}
});
上述这种情况无法进入lambda函数体内。
二、解决方法:
1.在发送信号的文件中加入 #include <QMetaType>
ControlPanel.h
#ifndef __CONTROLPANEL
#define __CONTROLPANEL
#include <thread>
#include <iostream>
#include <QObject>
#include "DataTrans.h"
#include <QMetaType>
class ControlPanel : public QObject
{
Q_OBJECT
public:
ControlPanel();
private:
void WriteMsg();
void ReadMsg();
signals:
void testSignal(ControlPanelCommand controlPanelCommand);
private:
DataTrans<ControlPanelCommand> Trans;
};
#endif
2.在构造函数中加入:qRegisterMetaType<结构体名>(“结构体名”);
构造函数:
ControlPanel::ControlPanel()
{
qRegisterMetaType<ControlPanelCommand>("ControlPanelCommand");
std::thread writeMsgThread(&ControlPanel::WriteMsg, this);
std::thread readMsgThread(&ControlPanel::ReadMsg, this);
writeMsgThread.detach();
readMsgThread.detach();
}
3.重新编译运行
三、解决方法2
问了一下文心一言,他说了下面几种方法:
二、解决方法中的解决方法为图片中说的第2种方法,下面使用第一种方法中的引用解决。
1.修改头文件信号函数
ControlPanel.h
#ifndef __CONTROLPANEL
#define __CONTROLPANEL
#include <thread>
#include <iostream>
#include <QObject>
#include "DataTrans.h"
class ControlPanel : public QObject
{
Q_OBJECT
public:
ControlPanel();
private:
void WriteMsg();
void ReadMsg();
signals:
void testSignal(ControlPanelCommand* controlPanelCommand);
private:
DataTrans<ControlPanelCommand> Trans;
};
#endif
2.修改发射信号
emit testSignal(&controlPanelCommand);
3.修改connect:
connect(controlPanel, &ControlPanel::testSignal, pGainSlider, [=](ControlPanelCommand* command){
std::cout << command.value << std::endl;
int GainSliderValue = pGainSlider->value();
if (GainSliderValue < pGainSlider->maximum()) {
pGainSlider->setValue(GainSliderValue+1);
}
});
跑了一遍,也是可以的。
参考: https://blog.csdn.net/weixin_43676892/article/details/126030219