高亮下位机温湿度

打印 上一主题 下一主题

主题 974|帖子 974|积分 2924

效果如下:

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

  • 首先我们要自界说一个类WenshiduHighlighter,继续自QSyntaxHighlighter
  • 实现构造函数,在构造函数中将需要匹配的正则和对应的格式创建,存到成员变量中
  • 重写父类的void highlightBlock(const QString &text) = 0函数,在该函数中对text使用之前创建的正则举行匹配,若匹配上了,则调用父类的setFormat方法将对应的格式设置进去
代码如下:
  1. //自定义一个高亮类,需要继承自抽象类QSyntaxHighlighter
  2. class WenshiduHighlighter:public QSyntaxHighlighter
  3. {
  4.     Q_OBJECT
  5. public:
  6.     //定义高亮规则结构体
  7.     struct HighlightRule
  8.     {
  9.         //需要匹配的正则(通过正则来找到你要想高亮的那一部分字符)
  10.         QRegularExpression pattern;
  11.         //正则匹配到的字符串对应的格式
  12.         QTextCharFormat format;
  13.     };
  14.     //实现构造函数,参数就是QTextEditor里面的内容,QTextDocument;
  15.     //该参数主要是为了用来初始化父类QSyntaxHighlighter
  16.     WenshiduHighlighter(QTextDocument* doc):QSyntaxHighlighter(doc)
  17.     {
  18.         //在构造函数中,初始化highlight_rules,创建想要高亮的内容和对应的格式
  19.         HighlightRule rule;
  20.         //下面就属于正则表达式的内容了 ,正则怎么写不赘述
  21.         //日期,在一对[]内
  22.         rule.pattern=QRegularExpression(R"(\[.*\])");
  23.         QTextCharFormat datetime_format;
  24.         datetime_format.setForeground(QColor(85,85,85));//设置前景色
  25.         datetime_format.setBackground(QColor(240,240,240));//设置背景色
  26.         datetime_format.setFontWeight(QFont::Bold);//设置加粗
  27.         datetime_format.setFontFamily("Consolas");
  28.         rule.format=datetime_format;
  29.         highlight_rules.push_back(rule);
  30.         //温度key
  31.         rule.pattern=QRegularExpression(R"(Temperature)");
  32.         QTextCharFormat temper_key_format;
  33.         temper_key_format.setForeground(QColor(180,30,110));
  34.         temper_key_format.setFontFamily("Consolas");
  35.         rule.format=temper_key_format;
  36.         highlight_rules.push_back(rule);
  37.         //温度value
  38.         rule.pattern=QRegularExpression(R"((?<=Temperature:)\s*-*\d+℃)");//反向预查,以Temperature:开始
  39.         QTextCharFormat temper_val_format;
  40.         temper_val_format.setForeground(QColor(180,30,110));
  41.         temper_val_format.setFontWeight(QFont::Bold);
  42.         temper_val_format.setFontFamily("Consolas");
  43.         rule.format=temper_val_format;
  44.         highlight_rules.push_back(rule);
  45.         //湿度key
  46.         rule.pattern=QRegularExpression(R"(Humidity)");
  47.         QTextCharFormat humi_key_format;
  48.         humi_key_format.setForeground(QColor(97,54,134));
  49.         humi_key_format.setFontFamily("Consolas");
  50.         rule.format=humi_key_format;
  51.         highlight_rules.push_back(rule);
  52.         //湿度value
  53.         rule.pattern=QRegularExpression(R"((?<=Humidity:)\s*\d+%)");//反向预查
  54.         QTextCharFormat humi_val_format;
  55.         humi_val_format.setForeground(QColor(97,54,134));
  56.         humi_val_format.setFontWeight(QFont::Bold);
  57.         humi_val_format.setFontFamily("Consolas");
  58.         rule.format=humi_val_format;
  59.         highlight_rules.push_back(rule);
  60.         //正常
  61.         rule.pattern=QRegularExpression(R"(\(Normal\))");
  62.         QTextCharFormat normal_format;
  63.         normal_format.setForeground(Qt::darkGreen);
  64.         normal_format.setFontFamily("Consolas");
  65.         rule.format=normal_format;
  66.         highlight_rules.push_back(rule);
  67.         //偏低
  68.         rule.pattern=QRegularExpression(R"(\(↓Lower\))");
  69.         QTextCharFormat lower_format;
  70.         lower_format.setForeground(Qt::white);
  71.         lower_format.setBackground(Qt::darkBlue);
  72.         lower_format.setFontWeight(QFont::Bold);
  73.         lower_format.setFontFamily("Consolas");
  74.         rule.format=lower_format;
  75.         highlight_rules.push_back(rule);
  76.         //偏高
  77.         rule.pattern=QRegularExpression(R"(\(↑Upper\))");
  78.         QTextCharFormat upper_format;
  79.         upper_format.setForeground(Qt::white);
  80.         upper_format.setBackground(QColor(220,50,50));
  81.         upper_format.setFontWeight(QFont::Bold);
  82.         upper_format.setFontFamily("Consolas");
  83.         rule.format=upper_format;
  84.         highlight_rules.push_back(rule);
  85.     }
  86.     ~WenshiduHighlighter()=default;
  87. protected:
  88.     //最后,我们要重写父类的抽象接口void highlightBlock(const QString &text) = 0
  89.     //这个函数的参数text,就是构造传进来的doc的每一行,
  90.     //该父类会自动把doc的每一行都来调用这个函数来进行匹配+高亮
  91.     void highlightBlock(const QString &text) override
  92.     {
  93.         //遍历所有的规则,来给每一行的数据匹配后设置格式
  94.         for(const auto& itor:highlight_rules)
  95.         {
  96.             auto match_list=itor.pattern.globalMatch(text);
  97.             //如果匹配到了
  98.             while(match_list.hasNext())
  99.             {
  100.                 auto match_result=match_list.next();
  101.                 //最后调用父类的setFormat方法设置格式
  102.                 //参数1:匹配到字符的开始索引
  103.                 //参数2:匹配到字符的长度
  104.                 //参数3:预先构造好的格式
  105.                 setFormat(match_result.capturedStart(),
  106.                           match_result.capturedLength(),
  107.                           itor.format);
  108.             }
  109.         }
  110.     }
  111. private:
  112.     std::vector<HighlightRule> highlight_rules;
  113. };
复制代码
 如何使用


  • 设置高亮,直接new一个WenshiduHighlighter,然后将QTextEditor内部文档的指针传过来
  • 取消高亮,直接delete掉前面new出来的WenshiduHighlighter
代码如下:
  1. class Widget : public QWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     Widget(QWidget *parent = nullptr):QWidget(parent)
  6.     {
  7.         setStyleSheet(R"(QPushButton{
  8.            font-family:"Microsoft YaHei";
  9.            font-size:13px;
  10.            font-weight:bold;
  11.          }
  12.          QCheckBox{
  13.            font-family:"Microsoft YaHei";
  14.            font-size:13px;
  15.            font-weight:bold;
  16.          })");
  17.         //整个窗口垂直布局
  18.         QVBoxLayout* v_box=new QVBoxLayout(this);
  19.         //创建复选框和两个按钮,三者采用水平布局
  20.         QHBoxLayout* h_box=new QHBoxLayout();
  21.         format_box=new QCheckBox(this);
  22.         format_box->setText("下位机温湿度高亮");
  23.         h_box->addWidget(format_box);
  24.         QSpacerItem* spacer1=new QSpacerItem(20,5,QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
  25.         h_box->addSpacerItem(spacer1);
  26.         btn_start_receive=new QPushButton(this);
  27.         btn_start_receive->setText("开始接收");
  28.         btn_start_receive->setFixedSize(80,30);
  29.         btn_start_receive->setCursor(Qt::PointingHandCursor);
  30.         h_box->addWidget(btn_start_receive);
  31.         QSpacerItem* spacer2=new QSpacerItem(20,5,QSizePolicy::Fixed,QSizePolicy::Fixed);
  32.         h_box->addSpacerItem(spacer2);
  33.         btn_clear=new QPushButton(this);
  34.         btn_clear->setText("清除数据");
  35.         btn_clear->setFixedSize(80,30);
  36.         btn_clear->setCursor(Qt::PointingHandCursor);
  37.         h_box->addWidget(btn_clear);
  38.         v_box->addLayout(h_box);
  39.         //创建内容区
  40.         edit_content=new QTextEdit(this);
  41.         //设置为等宽字体,来使上下两行的数据对齐
  42.         edit_content->setStyleSheet("font:16px Courier");
  43.         v_box->addWidget(edit_content);
  44.         resize(800,600);
  45.         timer=new QTimer(this);
  46.         //开始接收按钮
  47.         //则开始一个定时器,以500ms为间隔模拟生成一条温湿度数据,追加到editor中
  48.         connect(btn_start_receive,&QPushButton::clicked,this,[=](){
  49.             //定时器开着,则关闭定时器,停止追加数据
  50.             if(timer->isActive())
  51.             {
  52.                 timer->stop();
  53.                 btn_start_receive->setText("开始接收");
  54.             }
  55.             else
  56.             {
  57.                 //定时器关着,则开启定时器
  58.                 timer->start(500);
  59.                 btn_start_receive->setText("停止接收");
  60.             }
  61.         });
  62.         //清除按钮
  63.         connect(btn_clear,&QPushButton::clicked,this,[=](){
  64.             //清除数据
  65.             edit_content->clear();
  66.         });
  67.         //高亮下位机温湿度
  68.         connect(format_box,&QCheckBox::clicked,this,[=](){
  69.             if(format_box->isChecked())
  70.             {
  71.                 //如何产生高亮,直接new一个温湿度高亮者,就可以高亮了
  72.                 wenshidu_highlighter=new WenshiduHighlighter(edit_content->document());
  73.             }
  74.             else
  75.             {
  76.                 //如何取消高亮。直接delete将他析构好了
  77.                 delete wenshidu_highlighter;
  78.             }
  79.         });
  80.         //定时器
  81.         connect(timer,&QTimer::timeout,this,&Widget::addData);
  82.     }
  83.     ~Widget()=default;
  84. protected:
  85.     void addData()
  86.     {
  87.         QString str_data;
  88.         str_data+="[";
  89.         //日期时间
  90.         str_data+=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
  91.         str_data+="]  ";
  92.         //随机生成温度,范围【-10,50】
  93.         int temper=-10+QRandomGenerator::global()->generate()%61;
  94.         if(temper<10)
  95.         {
  96.             //arg(temper,3)表示温度占3位
  97.             str_data+=QString("%1%2%3").arg("Temperature: ").arg(temper,3).arg("℃ (↓Lower)  ");
  98.         }
  99.         else if(temper>=10&& temper<30)
  100.         {
  101.             str_data+=QString("%1%2%3").arg("Temperature: ").arg(temper,3).arg("℃ (Normal)  ");
  102.         }
  103.         else
  104.         {
  105.             str_data+=QString("%1%2%3").arg("Temperature: ").arg(temper,3).arg("℃ (↑Upper)  ");
  106.         }
  107.         //随机生成湿度,范围【20,100】
  108.         int humi=20+QRandomGenerator::global()->generate()%81;
  109.         if(humi<40)
  110.         {
  111.             str_data+=QString("%1%2%3").arg("Humidity: ").arg(humi,3).arg("% (↓Lower)");
  112.         }
  113.         else if(humi>=40 && humi<70)
  114.         {
  115.             str_data+=QString("%1%2%3").arg("Humidity: ").arg(humi,3).arg("% (Normal)");
  116.         }
  117.         else
  118.         {
  119.             str_data+=QString("%1%2%3").arg("Humidity: ").arg(humi,3).arg("% (↑Upper)");
  120.         }
  121.         edit_content->append(str_data);
  122.     }
  123. private:
  124.     QTimer* timer;
  125.     QCheckBox* format_box;//高亮内容
  126.     QPushButton* btn_start_receive;//接收数据
  127.     QPushButton* btn_clear;//清除内容
  128.     QTextEdit* edit_content;//内容区
  129.     WenshiduHighlighter* wenshidu_highlighter;
  130. };
复制代码
学习链接:https://github.com/0voice

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表