IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> QPlainTextEdit遍历显示数据,高亮显示匹配行的方法 -> 正文阅读

[嵌入式]QPlainTextEdit遍历显示数据,高亮显示匹配行的方法

	最近由于项目要求,需要显示软件操作日志且需要有搜索关键字功能。用到的控件是QPlainTextEdit,之所以不用QTextEdit显示文本,是因为当日志数据一多会造成程序卡顿(实测过,特别是用在嵌入式设备里面)。话不多说,直接上代码。
以下是关键代码:
.h文件
private:
    QTextDocument *loginDoc;			//plainTextEdit加载的文本对象
    int loginDocNum;					//文档中的文本块的数量,回车符是一个block
    int loginCurrentDocNum;				//当前遍历到loginDocNum的第几个数据

.cpp文件
//点击搜索按钮查找相应字段、并高亮显示查到的第一个数据所在行
void searchText()
{
	QString text = ui->lineEdit->text().trimmed();
    if(nullptr == text)
    {
        myHelper::ShowMessageBoxError(QString("搜索内容不能为空!"));
        return;
    }
    loginDoc = ui->txtMain->document(); //返回plainTextEdit加载的文本对象
    loginDocNum = loginDoc->blockCount() ;//返回文档中的文本块的数量,回车符是一个block
    travPlainTextDoc(index,loginDocNum,loginDoc,text);//index是我所使用到的控件stacketWidget的currentIndex,不用管。这个函数里面就是遍历数据以及高亮显示。
}
//遍历并高亮显示查询到的第一个数据所在行
void travPlainTextDoc(int index,int docNum,QTextDocument *doc,QString text)
{
//2021-7-23 若之前设置了标记,需要将之前的标记颜色改为背景色
	recoverExtraSelection(index);
	
    for (int i = 0; i < docNum; i++)
    {
        QTextBlock textLine = doc->findBlockByNumber(i) ; // 文本中的一段
        QString str = textLine.text();

        if(str.contains(text))
        {
            QList<QTextEdit::ExtraSelection> extraSelections;//提供一种方式显示选择的文本
            if(index == 0)
            {
                loginCurrentDocNum = i;
                extraSelections = ui->txtMain->extraSelections();//获取之前高亮的设置
                ui->txtMain->setTextCursor(QTextCursor(textLine));//更新可见光标
            }
            QTextEdit::ExtraSelection selection;
            QColor lineColor = QColor("#F79332");
            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);

            if(index == 0)
            {
                selection.cursor = ui->txtMain->textCursor();
            }
            selection.cursor.clearSelection();//通过设置锚到光标位置清除当前的选择
            extraSelections.append(selection);
            if(index == 0)
            {
                ui->txtMain->setExtraSelections(extraSelections);//设置高亮
            }
//查找到第一个就返回
            return;
        }
    }
}
//清除上一次的高亮行设置
void recoverExtraSelection(int index)
{
    QList<QTextEdit::ExtraSelection> selections;
    if(index == 0)
    {
        selections = ui->txtMain->extraSelections();
    }
//这一步是高亮之前的颜色,没有这一步即使选择下一行高亮了,上一行高亮的也不会消失。不想恢复的当我没说。
    for(int i = 0;i < selections.count();i++)
    {
        QColor lineColor = QColor("#646464");
        selections.at(i).format.setBackground(lineColor);
        selections.at(i).format.setProperty(QTextFormat::FullWidthSelection, true);
    }
    if(selections.count() > 0)
    {
        if(index == 0)
        {
            ui->txtMain->setExtraSelections(selections);//恢复背景色
            ui->txtMain->extraSelections().clear();
        }
    }
}

//上一个,我没有写成循环的遍历的
void on_btn_searchLast_clicked()
{
    int index = ui->stackedWidget->currentIndex();
    QString text = ui->lineEdit->text().trimmed();
    if(nullptr == text)
    {
        myHelper::ShowMessageBoxError(QString("当前搜索内容为空!"));
        return;
    }

    int currentDocNum = 0;
    int docNum = 0;
    QTextDocument *doc = nullptr;

    if(index == 0)
    {
        currentDocNum = loginCurrentDocNum;
        docNum = loginDocNum;
        doc = loginDoc;
    }
    
    if(currentDocNum == 0)
    {
        return;
    }

    recoverExtraSelection(index);

    for(int i = currentDocNum - 1;i < docNum;i--)
    {
        QTextBlock textLine = doc->findBlockByNumber(i) ; // 文本中的一段
        QString str = textLine.text();

        if(str.contains(text))
        {
            QList<QTextEdit::ExtraSelection> extraSelections;//提供一种方式显示选择的文本
            if(index == 0)
            {
                loginCurrentDocNum = i;
                extraSelections = ui->txtMain->extraSelections();//获取之前高亮的设置
                ui->txtMain->setTextCursor(QTextCursor(textLine));//更新可见光标
            }

            QTextEdit::ExtraSelection selection;
            QColor lineColor = QColor("#F79332");
            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);
            if(index == 0)
            {
                selection.cursor = ui->txtMain->textCursor();
            }
            selection.cursor.clearSelection();//通过设置锚到光标位置清除当前的选择
            extraSelections.append(selection);
            if(index == 0)
            {
                ui->txtMain->setExtraSelections(extraSelections);//设置高亮
            }
            return;
        }
    }
}

//下一个
void on_btn_searchNext_clicked()
{
    int index = ui->stackedWidget->currentIndex();
    QString text = ui->lineEdit->text().trimmed();
    if(nullptr == text)
    {
        myHelper::ShowMessageBoxError(QString("当前搜索内容为空!"));
        return;
    }

    int currentDocNum = 0;
    int docNum = 0;
    QTextDocument *doc = nullptr;

    if(index == 0)
    {
        currentDocNum = loginCurrentDocNum;
        docNum = loginDocNum;
        doc = loginDoc;
    }

    if(currentDocNum >= docNum - 1)
    {
        myHelper::ShowMessageBoxError(QString(""));
        return;
    }

    recoverExtraSelection(index);

    for(int i = currentDocNum + 1;i < docNum;i++)
    {
        QTextBlock textLine = doc->findBlockByNumber(i) ; // 文本中的一段
        QString str = textLine.text();

        if(str.contains(text))
        {
            QList<QTextEdit::ExtraSelection> extraSelections;//提供一种方式显示选择的文本
            if(index == 0)
            {
                loginCurrentDocNum = i;
                extraSelections = ui->txtMain->extraSelections();//获取之前高亮的设置
                ui->txtMain->setTextCursor(QTextCursor(textLine));//更新可见光标
            }

            QTextEdit::ExtraSelection selection;
            QColor lineColor = QColor("#F79332");
            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);

            if(index == 0)
            {
                selection.cursor = ui->txtMain->textCursor();
            }

            selection.cursor.clearSelection();//通过设置锚到光标位置清除当前的选择
            extraSelections.append(selection);
            if(index == 0)
            {
                ui->txtMain->setExtraSelections(extraSelections);//设置高亮
            }

            return;
        }
    }
}

上一个和下一个的代码未考虑到:当plainTextEdit新增数据后,上面的数据未更新的问题,自己改。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:39:31  更:2021-07-24 11:40:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:40:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码