本文介绍Qt5传递自定义数据,异步处理请求,代码如下;
#include <QApplication>
// 接口命令数据结构
typedef struct _CmdRequest {
QString func;
QMap<QString, QString> params;
} CmdRequest;
// 命令处理结果数据结构
typedef struct _RstResponse {
int retCode;
QString func;
QString msg;
QVector< QVector<QString> > result;
} RstResponse;
// 通过槽函数接收命令数据,异步处理结果后,通过信号发出处理结果
class CHandle : public QObject
{
Q_OBJECT
public:
explicit CHandle(QObject *parent = nullptr) {}
signals:
void resultReady(const RstResponse &result); // 发送处理结果
public slots:
void doHandle(const CmdRequest &cmd) // 接收命令数据
{
RstResponse result;
result.retCode = 0;
result.msg = "OK";
result.func = cmd.func;
emit resultReady(result);
}
private:
};
// 通过信号发出命令,通过槽函数接收命令处理结果
class CDataClass : public QObject
{
Q_OBJECT
public:
explicit CDataClass(QObject *parent = nullptr)
{
CHandle *handle = new CHandle;
handle->moveToThread(&mWorkerThread);
connect(&mWorkerThread, &QThread::finished, handle, &QObject::deleteLater);
connect(this, &CDataClass::operate, handle, &CHandle::doHandle);
connect(handle, &CHandle::resultReady, this, &CDataClass::handleResults);
mWorkerThread.start();
}
~CDataClass()
{
mWorkerThread.quit();
mWorkerThread.wait();
}
void handleCmd(const CmdRequest &cmd)
{
emit operate(cmd);
}
signals:
void operate(const CmdRequest &cmd);
void operateResult(const RstResponse &result);
public slots:
void handleResults(const RstResponse &result)
{
qDebug() << result.retCode << result.msg << result.func;
}
private:
QThread mWorkerThread;
};
#include "main.moc"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 注册自定义数据结构,用于信号槽
qRegisterMetaType<CmdRequest>("CmdRequest");
qRegisterMetaType<RstResponse>("RstResponse");
CDataClass dataCls;
CmdRequest cmd;
cmd.func = "checkPassword";
dataCls.handleCmd(cmd); //调用接口,触发信号
return a.exec();
}