【QT】异步处理

  1. 自定义信号/槽触发(类似观察者模式)
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();
};
  1. .h文件添加代码
public:
    void processHandleBySingal(QByteArray buffer, qint64 length);
    
    //自定义信号
signals:
    //信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
    void push_singal(QByteArray buffer, qint64 length);
  1. .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); //移动文本框内的插入符
}
  1. 异步线程处理

  2. .h文件添加代码

#include <QMetaObject>

public:
    Q_INVOKABLE void processHandle(QByteArray buffer, qint64 length);
  1. .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); //移动文本框内的插入符
}
posted @ 2024-07-06 09:26  qiutian-hao  阅读(93)  评论(0编辑  收藏  举报