关键信息标红

效果:

        导入一个文本文件到textEdit中,对指定的key关键字标红处理或者对关键字所在的行进行整行标红处理

实现:       

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_selectBtn_clicked();
    //void on_setBtn_clicked();

private:
    void defaultConfig();
    void loadStyleSheet(const QString &style);
    void filterKeyWord(const QString& key, const QString& color);

private:
    Ui::Widget *ui;
    QString mAppPath;
};
#endif // WIDGET_H


   cpp      //

#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <QDir>
#include <QFile>
#include <QStyle>
#include <QSettings>
#include <QTextStream>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextDocument>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    defaultConfig();
    loadStyleSheet(":/home.qss");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::loadStyleSheet(const QString &style)
{
    if(style.isEmpty())
        return;

    QFile file(style);
    if(!file.open(QFile::ReadOnly))
        return;

    this->style()->unpolish(this);
    setStyleSheet(file.readAll());
    this->style()->polish(this);
}

void Widget::on_selectBtn_clicked()
{
    QSettings config(mAppPath+"/setting.ini", QSettings::NativeFormat);
    auto lastPath = config.value("last_path", QDir::homePath()).toString();
    auto file = QFileDialog::getOpenFileName(this, tr("OpenFile"), lastPath,
                                 tr("Text(*.txt);; All file(*.*)"));
    if(file.isEmpty())
        return;

    QFile inputFile(file);
    inputFile.open(QIODevice::ReadOnly);
    QTextStream in(&inputFile);
    in.setCodec("UTF-8");
    ui->textEdit->setText(in.readAll());
    inputFile.close();

    config.setValue("last_path", file);
    ui->path->setText(file);
    //ui->textEdit->document()->undo();

    config.beginGroup("keys");
    auto kk = config.childKeys();
    foreach (auto key, config.childKeys())
        filterKeyWord(key, config.value(key, "#000").toString());
    config.endGroup();
}

void Widget::defaultConfig()
{
    mAppPath = QApplication::applicationDirPath();
    QSettings config(mAppPath+"/setting.ini", QSettings::NativeFormat);
    config.beginGroup("keys");
    if(config.childKeys().isEmpty())
    {
        config.setValue("ERROR", "#F00");
        config.setValue("FATAL", "#FF0");
    }
    config.endGroup();
}

void Widget::filterKeyWord(const QString &key, const QString &color)
{
    QTextDocument *document = ui->textEdit->document();

    bool found = false;

    // undo previous change (if any)
    //document->undo();

    if (key.isEmpty()) {
        QMessageBox::information(this, tr("Empty Search Field"),
                                 tr("The search field is empty. "
                                    "Please enter a word and click Find."));
    } else {
        QTextCursor highlightCursor(document);
        QTextCursor cursor(document);

        cursor.beginEditBlock();
//! [6]

        QTextCharFormat plainFormat(highlightCursor.charFormat());
        QTextCharFormat colorFormat = plainFormat;
        colorFormat.setForeground(QColor(color));

        while (!highlightCursor.isNull() && !highlightCursor.atEnd()) {
            highlightCursor = document->find(key, highlightCursor,
                                             QTextDocument::FindWholeWords);

            if (!highlightCursor.isNull()) {
                found = true;
            //如果只是对关键字选中,则放开下面注释,并将下面select函数调用行注释掉
//                highlightCursor.movePosition(QTextCursor::WordRight,
//                                             QTextCursor::KeepAnchor);
                highlightCursor.select(QTextCursor::LineUnderCursor);
                highlightCursor.mergeCharFormat(colorFormat);
            }
        }

//! [8]
        cursor.endEditBlock();
//! [7] //! [9]

        if (found == false) {
            QMessageBox::information(this, tr("Word Not Found"),
                                     tr("Sorry, the word cannot be found."));
        }
    }
}

ui文件,比较简单:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>LogParseTool</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1">
   <property name="spacing">
    <number>15</number>
   </property>
   <item>
    <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,0">
     <property name="spacing">
      <number>6</number>
     </property>
     <item>
      <widget class="QLabel" name="label">
       <property name="text">
        <string>File:</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLineEdit" name="path"/>
     </item>
     <item>
      <widget class="QPushButton" name="selectBtn">
       <property name="text">
        <string>Select</string>
       </property>
      </widget>
     </item>
     <item>
      <spacer name="horizontalSpacer">
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
       <property name="sizeType">
        <enum>QSizePolicy::Minimum</enum>
       </property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20</width>
         <height>20</height>
        </size>
       </property>
      </spacer>
     </item>
    </layout>
   </item>
   <item>
    <widget class="QTextEdit" name="textEdit">
     <property name="contextMenuPolicy">
      <enum>Qt::NoContextMenu</enum>
     </property>
     <property name="verticalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAsNeeded</enum>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

样式表,qss文件:

#Widget
{
    background-color: #4A4A4A;
}

#Widget #label
{
    color: #fff;
    font-weight: bold;
}

#path
{
    color: #fff;
    border-top: 0px solid red;
    border-bottom: 1px solid #cdcdcd;
    border-left: 0px solid red;
    border-right: 0px solid red;
    background: transparent;
}

#textEdit
{
    border-top: 0px solid red;
    border-bottom: 1px solid #cdcdcd;
    border-left: 1px solid #cdcdcd;
    border-right: 1px solid #cdcdcd;
    border: none;
    background-color: #4A4A4A;
}

#selectBtn, #setBtn
{
    color: black;
    background: #2d6699;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值