【QT】异步处理
- 自定义信号/槽触发(类似观察者模式)
1.自定义类必须从QObject类或者是其子类进行派生
2.在定义类的头文件中加入 Q_OBJECT 宏
// 自己新建类初始化配置
#include <QObject>
class Demo: public QObject
{
//Q_OBJECT 是一个宏,添加它才能正常使用 Qt 的信号和槽机制
Q_OBJECT
public:
explicit Demo(QObject *parent = nullptr);
signals:
void test();
};
- .h文件添加代码
public:
void processHandleBySingal(QByteArray buffer, qint64 length);
//自定义信号
signals:
//信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
void push_singal(QByteArray buffer, qint64 length);
- .cpp文件添加代码
// 自定义信号/槽函数绑定处理(异步处理)
connect(this, &MainWindow::push_singal, this, &MainWindow::processHandleBySingal, Qt::QueuedConnection);
// 异步接收到串口数据
void MainWindow::slotReadData()
{
QByteArray buffer = serial->readAll();
if(!buffer.isEmpty()) { //如果非空说明有数据接收
// 信号发送信息
emit push_singal(buffer, buffer.count());
}
buffer.clear();
}
// 自定义信号触发接收处理
void MainWindow::processHandleBySingal(QByteArray buffer, qint64 length)
{
//qDebug() << "接收到数据:" + QString::number(length);
QString buffer_1;
//转换成16进制大写
QString str = buffer.toHex().data();
str = str.toUpper();
//一个16进制占4位,8位为一字节,所以每两位16进制空一格
for(int i = 0; i < str.length(); i += 2) {
QString str_1 = str.mid (i, 2);
buffer_1 += str_1;
buffer_1 += " ";
}
dateTime = QDateTime::currentDateTime(); //获取系统当前的时间
QString timeStr = dateTime .toString("yyyy-MM-dd hh:mm:ss");//格式化时间
if(ui->textEdit->toPlainText().count() > 20000) {
ui->textEdit->clear();
}
ui->textEdit->append("[" + timeStr + "]" + buffer_1);
ui->textEdit->moveCursor(QTextCursor::End); //移动文本框内的插入符
}
-
异步线程处理
-
.h文件添加代码
#include <QMetaObject>
public:
Q_INVOKABLE void processHandle(QByteArray buffer, qint64 length);
- .cpp文件添加代码
// 异步接收数据处理
void MainWindow::slotReadData()
{
QByteArray buffer = serial->readAll();
if(!buffer.isEmpty()) { //如果非空说明有数据接收
// 异步线程实现
QMetaObject::invokeMethod(this, "processHandle", Qt::QueuedConnection, Q_ARG(QByteArray, buffer), Q_ARG(qint64, buffer.count()));
}
buffer.clear();
}
// 接收数据处理
void MainWindow::processHandle(QByteArray buffer, qint64 length)
{
//qDebug() << "接收到数据:" + QString::number(length);
QString buffer_1;
//转换成16进制大写
QString str = buffer.toHex().data();
str = str.toUpper();
//一个16进制占4位,8位为一字节,所以每两位16进制空一格
for(int i = 0; i < str.length(); i += 2) {
QString str_1 = str.mid (i, 2);
buffer_1 += str_1;
buffer_1 += " ";
}
dateTime = QDateTime::currentDateTime(); //获取系统当前的时间
QString timeStr = dateTime .toString("yyyy-MM-dd hh:mm:ss");//格式化时间
if(ui->textEdit->toPlainText().count() > 20000) {
ui->textEdit->clear();
}
ui->textEdit->append("[" + timeStr + "]" + buffer_1);
ui->textEdit->moveCursor(QTextCursor::End); //移动文本框内的插入符
}