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