首页 > 其他分享 >【QT】异步处理

【QT】异步处理

时间:2024-07-06 09:31:14浏览次数:16  
标签:异步 QByteArray QT textEdit 处理 void qint64 buffer

  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); //移动文本框内的插入符
}

标签:异步,QByteArray,QT,textEdit,处理,void,qint64,buffer
From: https://www.cnblogs.com/qiutian-hao/p/18286907

相关文章

  • [python]Markdown图片引用格式批处理桌面应用程序
    需求使用python编写一个exe,实现批量修改图片引用,将修改后的文件生成为文件名_blog.md。有一个编辑框,允许接收拖动过来md文件,拖入文件时获取文件路径,有一个编辑框编辑修改后的文件的输出路径,用户拖入文件时,就能自动得到输出的路径作用是将md文件中的例如![image-20240706062921......
  • Qt提升控件失败的解决办法
    在QtCreator中,通常是可以通过继承已有的类来创建新的子类的。如果您想要将QGraphicsView提升为新建的子类,可以按照以下步骤进行操作:打开QtCreator,并打开您的项目。打开包含QGraphicsView的头文件(例如mainwindow.h)。选择QGraphicsView类的声明,并右键单击该类。在弹......
  • Qt网络编程
    0.前置知识Socket是不同主机之间通信的APIIP地址用于区分不同主机/端口用于区分不用应用QHostInfo可查找与主机名相关联的IP地址或与IP地址相关联的主机名。该类提供了两个静态便利函数:一个是异步函数,在找到主机后发出信号;另一个是阻塞函数,返回一个QHostInfo对象。......
  • Python Pandas实现高效表格自动化处理
    1.Pandas简介Pandas是Python中用于数据分析和处理的强大库,它提供了高性能、易用的数据结构和工具。对于处理结构化数据,特别是表格数据,Pandas是一个不可或缺的工具。本文将介绍如何使用Pandas进行表格自动化处理。2.安装Pandas使用pip安装Pandas:pipinstallpandas......
  • 关于离线处理 Windows 系统中硬件驱动程序的详细说明:
    关于离线处理Windows系统中硬件驱动程序的详细说明:1.使用DISM离线卸载所有OEM驱动程序DISM(DeploymentImageServicingandManagement)是一个强大的工具,用于管理和准备Windows映像。通过DISM,可以在离线环境中卸载所有OEM驱动程序。打开命令提示符(管理员权限):右键点......
  • 哈希处理字符串(模板)
    841.字符串哈希-AcWing题库#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'constintN=1e5+10;intp=131;//13331intP[N],h[N];//P存的是p的k次方,h存字符串前k个数(换化成ascll码)intfind(intl,intr){returnh[r......
  • set_source_files_properties QT_QML_SINGLETON_TYPE
    目录前言QT_QML_SINGLETON_TYPE 属性基本用法示例1.创建一个基本的CMake项目2.编辑 CMakeLists.txt3.创建 main.cpp4.创建 MySingleton.qml5.创建 qml.qrc6.创建 main.qml构建和运行项目结论前言在使用Qt和CMake构建项目时,有时你可能需要将......
  • 在Linux中,假如公司网站访问速度变的很慢很慢,该如何处理?
    在Linux服务器上解决公司网站访问速度慢的问题,可以从多个角度进行分析和处理。以下是一些步骤和方法:网络性能分析:检查服务器的带宽使用情况,确认是否有大量数据传输导致网络拥堵。使用工具如ping命令检测服务器与外部网络的连通性。利用traceroute命令追踪数据包路由路径,查......
  • Python异步编程技术详解:async、await、yield和anext
    Python异步编程技术详解:async、await、yield和anext1.async和await2.yield3.anext4.StopAsyncIteration5.综合示例:异步聊天机器人总结异步编程是Python中一种强大的并发编程模式,可以显著提高I/O密集型应用的性能。本文将详细介绍Python中的几种重要的异步编......
  • Java使用线程实现异步运行
    在Java中,实现异步运行的一个常用方式是使用Thread类。下面,我将给出一个详细且完整的示例,该示例将创建一个简单的异步任务,该任务将模拟一个耗时的操作(比如,模拟网络请求或文件处理)。1.使用Thread类实现异步运行假设我们有一个任务,该任务需要模拟一个耗时操作,比如从网络下载一个大......