Qt解析含颜色的QString字符串显示到控件

1、需求

开发接收含颜色字符串显示到窗口,可解析字符串颜色配置窗口属性,且分割字符串显示。
mprintf(“xxxxxx”);打印的xxxxxx含有颜色配置。

2、实现方法

选用Qt的PlainTextEdit控件显示字符串,配置为只读模式

2.1、串口初始化方式
第1种方式:收到数据及时显示(目前我使用的方式)
  • 优点:收到数据及时显示,响应快
  • 缺点:数据较长时会分包

初始化串口成功后,用下列代码绑定串口信号

connect(this->serialPort,SIGNAL(readyRead()),this,SLOT(log_serialread()));

/* readyRead()触发,接收到的数据长度是不定长的 */
/* log_serialread()是自己实现的接收函数 */
第2种方式:定时接收数据
  • 优点:不分包
  • 缺点:不及时,接收数据过多过快时关闭串口会崩溃,只适用于数据量不多不快的场景

初始化串口成功后,用下列代码绑定串口信号,再绑定1个定时器,有数据信号时先开启定时器,计时结束再读数据

/* log_pTimerRecv()是自己实现的函数 */
void logThread::log_pTimerRecv()
{
   
   
		if(!pTimerRecv->isActive())
    {
   
   
    	pTimerRecv->start(10); //readyRead后,开启定时器,等待10ms再读取数据
    }
}
QTimer *pTimerRecv;

connect(this->serialPort,SIGNAL(readyRead()),this,SLOT(log_pTimerRecv()));

//串口模式-数据延迟接收-保证数据完整
pTimerRecv = new QTimer(this);
pTimerRecv->setTimerType(Qt::PreciseTimer);
pTimerRecv->setSingleShot(true); //只触发一次
connect(pTimerRecv, SIGNAL(timeout()), this, SLOT(log_serialread()));

/* readyRead()触发,接收到的数据长度是不定长的 */
/* log_serialread()是自己实现的接收函数 */
2.2、颜色配置函数

颜色规则参考链接: ANSI控制码

void logThread::display_config(const QString &text)
{
   
   
    QTextCharFormat fmt;
    QMap<QString, int> map; //颜色列表
    map["black"] = 30;  //背景色40
    map["red"] = 31;    //背景色41
    map["green"] = 32;  //背景色42
    map["yellow"] = 33; //背景色43
    map["blue"] = 34;   //背景色44
    map["magenta"] = 35;//背景色45
    map["cyan"] = 36;   //背景色46
    map["white"] = 37;  //背景色47

    QString text_style = text;
    QRegularExpression regex("\x1b\\["); 
    QRegularExpression regex_else("m"); 
    text_style = text_style.remove(regex); //去掉\033[
    text_style = text_style.remove(regex_else); //去掉m

    QStringList list 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值