高亮下位机温湿度

news2024/9/20 14:27:03

效果如下:

如何对QTextEditor中的内容进行高亮和格式化显示:

  1. 首先我们要自定义一个类WenshiduHighlighter,继承自QSyntaxHighlighter
  2. 实现构造函数,在构造函数中将需要匹配的正则和对应的格式创建,存到成员变量中
  3. 重写父类的void highlightBlock(const QString &text) = 0函数,在该函数中对text利用之前创建的正则进行匹配,若匹配上了,则调用父类的setFormat方法将对应的格式设置进去

代码如下:

//自定义一个高亮类,需要继承自抽象类QSyntaxHighlighter
class WenshiduHighlighter:public QSyntaxHighlighter
{
    Q_OBJECT
public:

    //定义高亮规则结构体
    struct HighlightRule
    {
        //需要匹配的正则(通过正则来找到你要想高亮的那一部分字符)
        QRegularExpression pattern;

        //正则匹配到的字符串对应的格式
        QTextCharFormat format;
    };

    //实现构造函数,参数就是QTextEditor里面的内容,QTextDocument;
    //该参数主要是为了用来初始化父类QSyntaxHighlighter
    WenshiduHighlighter(QTextDocument* doc):QSyntaxHighlighter(doc)
    {
        //在构造函数中,初始化highlight_rules,创建想要高亮的内容和对应的格式
        HighlightRule rule;

        //下面就属于正则表达式的内容了 ,正则怎么写不赘述

        //日期,在一对[]内
        rule.pattern=QRegularExpression(R"(\[.*\])");
        QTextCharFormat datetime_format;
        datetime_format.setForeground(QColor(85,85,85));//设置前景色
        datetime_format.setBackground(QColor(240,240,240));//设置背景色
        datetime_format.setFontWeight(QFont::Bold);//设置加粗
        datetime_format.setFontFamily("Consolas");
        rule.format=datetime_format;
        highlight_rules.push_back(rule);

        //温度key
        rule.pattern=QRegularExpression(R"(Temperature)");
        QTextCharFormat temper_key_format;
        temper_key_format.setForeground(QColor(180,30,110));
        temper_key_format.setFontFamily("Consolas");
        rule.format=temper_key_format;
        highlight_rules.push_back(rule);

        //温度value
        rule.pattern=QRegularExpression(R"((?<=Temperature:)\s*-*\d+℃)");//反向预查,以Temperature:开始
        QTextCharFormat temper_val_format;
        temper_val_format.setForeground(QColor(180,30,110));
        temper_val_format.setFontWeight(QFont::Bold);
        temper_val_format.setFontFamily("Consolas");
        rule.format=temper_val_format;
        highlight_rules.push_back(rule);


        //湿度key
        rule.pattern=QRegularExpression(R"(Humidity)");
        QTextCharFormat humi_key_format;
        humi_key_format.setForeground(QColor(97,54,134));
        humi_key_format.setFontFamily("Consolas");
        rule.format=humi_key_format;
        highlight_rules.push_back(rule);

        //湿度value
        rule.pattern=QRegularExpression(R"((?<=Humidity:)\s*\d+%)");//反向预查
        QTextCharFormat humi_val_format;
        humi_val_format.setForeground(QColor(97,54,134));
        humi_val_format.setFontWeight(QFont::Bold);
        humi_val_format.setFontFamily("Consolas");
        rule.format=humi_val_format;
        highlight_rules.push_back(rule);

        //正常
        rule.pattern=QRegularExpression(R"(\(Normal\))");
        QTextCharFormat normal_format;
        normal_format.setForeground(Qt::darkGreen);
        normal_format.setFontFamily("Consolas");
        rule.format=normal_format;
        highlight_rules.push_back(rule);

        //偏低
        rule.pattern=QRegularExpression(R"(\(↓Lower\))");
        QTextCharFormat lower_format;
        lower_format.setForeground(Qt::white);
        lower_format.setBackground(Qt::darkBlue);
        lower_format.setFontWeight(QFont::Bold);
        lower_format.setFontFamily("Consolas");
        rule.format=lower_format;
        highlight_rules.push_back(rule);


        //偏高
        rule.pattern=QRegularExpression(R"(\(↑Upper\))");
        QTextCharFormat upper_format;
        upper_format.setForeground(Qt::white);
        upper_format.setBackground(QColor(220,50,50));
        upper_format.setFontWeight(QFont::Bold);
        upper_format.setFontFamily("Consolas");
        rule.format=upper_format;
        highlight_rules.push_back(rule);
    }

    ~WenshiduHighlighter()=default;

protected:
    //最后,我们要重写父类的抽象接口void highlightBlock(const QString &text) = 0
    //这个函数的参数text,就是构造传进来的doc的每一行,
    //该父类会自动把doc的每一行都来调用这个函数来进行匹配+高亮
    void highlightBlock(const QString &text) override
    {
        //遍历所有的规则,来给每一行的数据匹配后设置格式
        for(const auto& itor:highlight_rules)
        {
            auto match_list=itor.pattern.globalMatch(text);
            //如果匹配到了
            while(match_list.hasNext())
            {
                auto match_result=match_list.next();

                //最后调用父类的setFormat方法设置格式
                //参数1:匹配到字符的开始索引
                //参数2:匹配到字符的长度
                //参数3:预先构造好的格式
                setFormat(match_result.capturedStart(),
                          match_result.capturedLength(),
                          itor.format);
            }
        }
    }

private:
    std::vector<HighlightRule> highlight_rules;

};

 如何使用

  • 设置高亮,直接new一个WenshiduHighlighter,然后将QTextEditor内部文档的指针传过来
  • 取消高亮,直接delete掉前面new出来的WenshiduHighlighter

代码如下:

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr):QWidget(parent)
    {
        setStyleSheet(R"(QPushButton{
           font-family:"Microsoft YaHei";
           font-size:13px;
           font-weight:bold;
         }
         QCheckBox{
           font-family:"Microsoft YaHei";
           font-size:13px;
           font-weight:bold;
         })");
        //整个窗口垂直布局
        QVBoxLayout* v_box=new QVBoxLayout(this);

        //创建复选框和两个按钮,三者采用水平布局
        QHBoxLayout* h_box=new QHBoxLayout();

        format_box=new QCheckBox(this);
        format_box->setText("下位机温湿度高亮");
        h_box->addWidget(format_box);

        QSpacerItem* spacer1=new QSpacerItem(20,5,QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
        h_box->addSpacerItem(spacer1);

        btn_start_receive=new QPushButton(this);
        btn_start_receive->setText("开始接收");
        btn_start_receive->setFixedSize(80,30);
        btn_start_receive->setCursor(Qt::PointingHandCursor);
        h_box->addWidget(btn_start_receive);

        QSpacerItem* spacer2=new QSpacerItem(20,5,QSizePolicy::Fixed,QSizePolicy::Fixed);
        h_box->addSpacerItem(spacer2);

        btn_clear=new QPushButton(this);
        btn_clear->setText("清除数据");
        btn_clear->setFixedSize(80,30);
        btn_clear->setCursor(Qt::PointingHandCursor);
        h_box->addWidget(btn_clear);

        v_box->addLayout(h_box);

        //创建内容区
        edit_content=new QTextEdit(this);
        //设置为等宽字体,来使上下两行的数据对齐
        edit_content->setStyleSheet("font:16px Courier");
        v_box->addWidget(edit_content);

        resize(800,600);

        timer=new QTimer(this);

        //开始接收按钮
        //则开始一个定时器,以500ms为间隔模拟生成一条温湿度数据,追加到editor中
        connect(btn_start_receive,&QPushButton::clicked,this,[=](){
            //定时器开着,则关闭定时器,停止追加数据
            if(timer->isActive())
            {
                timer->stop();
                btn_start_receive->setText("开始接收");
            }
            else
            {
                //定时器关着,则开启定时器
                timer->start(500);
                btn_start_receive->setText("停止接收");
            }
        });

        //清除按钮
        connect(btn_clear,&QPushButton::clicked,this,[=](){
            //清除数据
            edit_content->clear();
        });

        //高亮下位机温湿度
        connect(format_box,&QCheckBox::clicked,this,[=](){
            if(format_box->isChecked())
            {
                //如何产生高亮,直接new一个温湿度高亮者,就可以高亮了
                wenshidu_highlighter=new WenshiduHighlighter(edit_content->document());
            }
            else
            {
                //如何取消高亮。直接delete将他析构好了
                delete wenshidu_highlighter;
            }
        });

        //定时器
        connect(timer,&QTimer::timeout,this,&Widget::addData);

    }
    ~Widget()=default;
protected:
    void addData()
    {
        QString str_data;
        str_data+="[";
        //日期时间
        str_data+=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
        str_data+="]  ";

        //随机生成温度,范围【-10,50】
        int temper=-10+QRandomGenerator::global()->generate()%61;
        if(temper<10)
        {
            //arg(temper,3)表示温度占3位
            str_data+=QString("%1%2%3").arg("Temperature: ").arg(temper,3).arg("℃ (↓Lower)  ");
        }
        else if(temper>=10&& temper<30)
        {
            str_data+=QString("%1%2%3").arg("Temperature: ").arg(temper,3).arg("℃ (Normal)  ");
        }
        else
        {
            str_data+=QString("%1%2%3").arg("Temperature: ").arg(temper,3).arg("℃ (↑Upper)  ");
        }

        //随机生成湿度,范围【20,100】
        int humi=20+QRandomGenerator::global()->generate()%81;
        if(humi<40)
        {
            str_data+=QString("%1%2%3").arg("Humidity: ").arg(humi,3).arg("% (↓Lower)");
        }
        else if(humi>=40 && humi<70)
        {
            str_data+=QString("%1%2%3").arg("Humidity: ").arg(humi,3).arg("% (Normal)");
        }
        else
        {
            str_data+=QString("%1%2%3").arg("Humidity: ").arg(humi,3).arg("% (↑Upper)");
        }

        edit_content->append(str_data);

    }

private:
    QTimer* timer;

    QCheckBox* format_box;//高亮内容

    QPushButton* btn_start_receive;//接收数据

    QPushButton* btn_clear;//清除内容

    QTextEdit* edit_content;//内容区

    WenshiduHighlighter* wenshidu_highlighter;

};

学习链接:https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DNS应答报文分析

目录 DNS应答以太网数据帧 1. 数据链路层 1.1 以太网首部:(目的MAC地址6字节)(源MAC地址6字节)(帧类型2字节)共14字节 1.2 以太网首部数据 2. 网络层 2.1 IP协议头部共20个字节 2.2 IP协议头部数据 3. 传输层 3.1 UDP头部共8字节 3.2 UDP头部数据 4. 应用层 4.1 D…

低空经济第一站:无人机飞手人才培养技术详解

在低空经济蓬勃发展的背景下&#xff0c;无人机飞手作为直接操作者和应用者&#xff0c;其人才培养技术成为推动这一新兴经济形态持续健康发展的关键。以下是对无人机飞手人才培养技术的详细解析&#xff1a; 一、培养目标 无人机飞手的培养旨在培养具备扎实无人机操作技能、…

_Array类,类似于Vector,其实就是_string

例子&#xff1a; using namespace lf; using namespace std;int main() {_Array<int> a(10, -1);_Array<_string> s { _t("one"), _t("two") };_pcn(a);_pcn(s);} 结果&#xff1a; 源代码_Array.h&#xff1a; /***********************…

el-table 的单元格 + 图表 + 排序

<el-table border :data"tableDataThree" height"370px" style"width: 100%"><el-table-column :key"activeName 8" width"50" type"index" label"序号" align"center"></el…

macOS系统Homebrew工具安装及使用

1.打开Homebrew — The Missing Package Manager for macOS (or Linux) 2.复制安装命令到终端执行 复制 执行 3. 开始自动安装过程 4.安装成功 5.使用brew安装wget工具

第L6周:机器学习-随机森林(RF)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1.什么是随机森林&#xff08;RF&#xff09; 随机森林&#xff08;Random Forest, RF&#xff09;是一种由 决策树 构成的 集成算法 &#…

WebSocket vs. Server-Sent Events:选择最适合你的实时数据流技术

引言&#xff1a; 在当今这个信息爆炸的时代&#xff0c;用户对于网页应用的实时性要求越来越高。从即时通讯到在线游戏&#xff0c;再到实时数据监控&#xff0c;WebSocket技术因其能够实现浏览器与服务器之间的全双工通信而受到开发者的青睐。 WebSocket技术为现代Web应用…

java计算机毕设课设—电子政务网系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—电子政务网系统(附源码、文章、相关截图、部署视频) 电子政务网系统主要用于提升政府机关的政务管理效率&#xff0c;核心功能包括前台网站展示、留言板管理、后台登录与密码修改、网站公告发布、政府部…

高级Java程序员必备的技术点:你准备好了吗?

在Java编程的世界里&#xff0c;成为一名高级程序员不仅需要深厚的基础知识&#xff0c;还需要掌握一系列高级技术和最佳实践。这些技术点是通向技术专家之路的敲门砖&#xff0c;也是应对复杂项目挑战的利器。本文将探讨高级Java程序员必备的技术点&#xff0c;帮助你自我提升…

VS code 安装使用配置 Continue

Continue 插件介绍 Continue 是一款高效的 VS Code 插件&#xff0c;提供类似 GitHub Copilot 的功能&#xff0c;旨在提升开发者的编程效率。其配置简单&#xff0c;使用体验流畅&#xff0c;深受开发者喜爱。 主要功能特点 智能代码补全 Continue 能够基于当前代码上下文生…

MATLAB 可视化基础:绘图命令与应用

目录 1. 绘制子图1.1基本绘图命令1.2. 使用 subplot 函数1.3. 绘图类型 2.MATLAB 可视化进阶(以下代码均居于以上代码的数据定义上实现)2.1. 极坐标图2.3. 隐函数的绘制 3.总结 在数据分析和科学计算中&#xff0c;数据可视化是理解和解释结果的关键工具。今天&#xff0c;我将…

Javaの运算符 Day5

1. 算数运算符 1.1 二元运算符&#xff08;两个操作数&#xff09;的算数运算符 操作符描述求和-求差*求积/求商%求余 代码举例 public class TestOperator {public static void main(String[] args) {int a 20;int b 12;System.out.println(a b);System.out.println(a …

【算法】队列与BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;N 叉树的层序遍历 .1- 题目解析 .2- 代码编写 2&#xff09;二叉树的锯齿形层序遍历 .1- 题目解析 .2- 代码编写 3&#xff09;二叉树最大宽度 .1- 题目解析 .2- 代码编写 4&#xf…

UART协议

目录 一、概述二、帧格式起始位数据位奇偶校验位停止位 三、数据传输过程四、串行通信接口RS232RS422RS485 五、UART环回程序设计 参考&#xff1a;正点原子FPGA开发指南 一、概述 UART&#xff08;通用异步收发器&#xff09;是一种异步、全双工的串行通信总线&#xff0c;在…

CGAL 从DSM到DTM holefilling remeshing

CGAL 从DSM到DTM holefilling & remeshing 上一节简单地删除被建筑物覆盖的大片区域中的顶点会导致大的Delaunay三角面&#xff0c;从而得到了较差的DTM&#xff0c;所以一个额外的步骤可以帮助产生更好的形状网格:删除大于阈值的面&#xff0c;并用孔洞填充算法进行三角化…

C++速通LeetCode简单第17题-爬楼梯

思路要点&#xff1a;将问题转化为求斐波那契数列的第n项&#xff0c;然后迭代。 思路分析&#xff1a;最后一次爬的阶数不是1就是2&#xff0c;假设爬n阶的方法数是f(n)&#xff0c;假设最后一次爬1阶&#xff0c;那么爬前面的 n-1阶的方法数是f(n-1)&#xff1b;假设最后一次…

力扣题解2848

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;简单&#xff09;&#xff1a; 与车相交的点 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &…

熵权法详细讲解+Python代码实现

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

基于单片机的超声波液位检测系统(论文+源码)

1总体设计 本课题为基于单片机的超声波液位检测系统的设计&#xff0c;系统的结构框图如图2.1所示。其中包括了按键模块&#xff0c;温度检测模块&#xff0c;超声波液位检测模块&#xff0c;显示模块&#xff0c;蜂鸣器等器件设备。其中&#xff0c;采用STC89C52单片机作为主…