首页 > 其他分享 >QTreeView实现搜索功能并且关键字标红

QTreeView实现搜索功能并且关键字标红

时间:2024-09-14 17:24:32浏览次数:7  
标签:index QTreeView text filter 关键字 标红 font rect QString

1、需求描述

实现组织树搜索,关键字红色显示;搜索规则,名称匹配显示,没有匹配不显示,子节点匹配,父节点即使没有匹配也显示;

2.实现方法

(1)top节点名称匹配关键则显示,否则隐藏

void TreeTaskList::SlotFilterChanged(QString strText)
{
    m_TreeDelegate->setProperty("FilterString", strText);//给代理设置搜索关键字
    QRegExp regExp(strText, Qt::CaseInsensitive);
    for (int i = 0; i < m_modelTree->rowCount(); i++)
    {
        QStandardItem* topitem = m_modelTree->item(i, 0);
        bool iret = RecluserFindItem(topitem, regExp);

        QString strName = topitem->data(Qt::UserRole).toMap().value("name").toString();
        if (strName.contains(regExp) || iret == false)
        {
            ui.treeView->setRowHidden(i, topitem->index().parent(), false);
        }
        else
        {
            ui.treeView->setRowHidden(i, topitem->index().parent(), true);
        }
    }
}

(2)递归查看子节点名称是否匹配

如果子节点包含关键字,父节点没有包含关键字也要显示

bool TreeTaskList::RecluserFindItem(QStandardItem* pFItem, QRegExp strText)
{

    bool rethidden = true;
    if (pFItem == NULL)
    {
        return rethidden;
    }

    int rowcount = pFItem->rowCount();
    for (int c = rowcount - 1; c >= 0; c--)
    {
        QStandardItem* childItem = pFItem->child(c, 0);
        if (childItem != NULL)
        {
            if (strText.isEmpty())
            {
                ui.treeView->setRowHidden(c, pFItem->index(), false);
                RecluserFindItem(childItem, strText);
                rethidden = false;
            }
            else
            {
                bool childret = RecluserFindItem(childItem, strText);
                if (childret == false)
                {
                    rethidden = false;
                }
                QString strName = childItem->data(Qt::UserRole).toMap().value("name").toString();
                if (strName.contains(strText) || childret == false)
                {
                    ui.treeView->setRowHidden(c, pFItem->index(), false);
                    rethidden = false;
                }
                else
                {
                    ui.treeView->setRowHidden(c, pFItem->index(), true);
                }
            }
        }

    }
    return rethidden;
}

(3)匹配文字显示红色

要使搜索关键字变成红色,需要在代理中重写代理的paintevent函数,绘制文字颜色;根据设置给代理的属性"FilterString",就是搜索关键字,匹配名称,匹配的关键字设置为红色,文字长度超出范围,增加省略号;

void TreeTaskDelegate::paintName(QPainter *painter,QRect rect,QString strName) const
{
    QString filter = this->property("FilterString").isValid() ? this->property("FilterString").toString() : "";
    painter->save();

    QColor text_color = QColor(255, 255, 255, 0.7);          // 文本颜色
    QColor filter_color = QColor(250, 50, 57, 255);      // 高亮颜色
                                                         // 高亮文本
    QString filter_text = filter;  // 文字与过滤文字首先获取出来
    QString text = strName;
    QFont font;
    font.setPixelSize(16);
    font.setFamily("Microsoft YaHei UI");
    painter->setFont(font);
    QFontMetrics font_metrics(font);
    int realwidth=font_metrics.width(text);
    int text_width = rect.width();
    QTextDocument m_LabelName;
    m_LabelName.setDefaultFont(font);

    // 右部显示省略号
    QFontMetrics font_width(font);
    //text = font_width.elidedText(text, Qt::ElideRight, text_width);
    // 然后将匹配项加上font-color标签,若非空的话
    if (!filter_text.isEmpty())
    {
        int last_index = text.lastIndexOf(filter_text, -1, Qt::CaseInsensitive);
        while (last_index != -1)
        {
            text.insert(last_index + filter_text.length(), "</font>");
            text.insert(last_index, QString("<font color=%1>").arg(filter_color.name()));
            last_index = text.lastIndexOf(filter_text, last_index, Qt::CaseInsensitive);
        }
    }

    // 在文档中设置字体,并设置文字
    QString strColorText = QString("<font color=%1>%2</font>").arg(text_color.name()).arg(text);
    m_LabelName.setHtml(strColorText);
    int y =40;//居中显示高度
    y = (y - 24) / 2;
    if (y < 0)
    {
        y = 0;
    }
    QRect text_rect = rect;  // 文字高度为20,所以文字上下空白为6px
    int h1 = text_rect.height();
    int h2 = font_metrics.height();
    painter->translate(QPoint(text_rect.x(), text_rect.y() -2));// +(text_rect.height() - font_metrics.height()) / 2)
    m_LabelName.drawContents(painter, text_rect.translated(-text_rect.x(), -text_rect.y()));
    painter->restore();
    if (realwidth > text_rect.width())//超过长度绘制省略号
    {
        QRect rectsl = QRect(text_rect.right()+1, text_rect.y(), 20, 24);
        painter->drawText(rectsl, Qt::AlignLeft | Qt::AlignVCenter, "…");
    }
}

 

标签:index,QTreeView,text,filter,关键字,标红,font,rect,QString
From: https://www.cnblogs.com/bclshuai/p/18414403

相关文章

  • QTreeView代理QStyledItemDelegate实现按钮的鼠标hover移动和点击响应
    1.需求描述QStyledItemDelegate实现按钮的点击和响应功能,鼠标移动到按钮上,也会显示tooltip提示信息2.实现方法(1)重写editorEvent函数,根据type类型触发不同的响应函数为了实现按钮的响应,需要重写QStyledItemDelegate类的editorEvent函数,并根据插入时设置进去的type类型,判断是......
  • QTreeView代理QStyledItemDelegate实现按钮、图标的绘制
    1.需求描述代理实现按钮图标状态的绘制实现方法(1)重写paint函数,根据type类型绘制案件、文件夹、监控点、视频任务; 为了实现不同的item的样式,需要继承QStyledItemDelegate类型实现TreeTaskDelegate。重写paint函数,根据不同的类型type去绘制不同的按钮和状态;voidTreeTaskD......
  • java_day1_认识计算机,java环境,Java关键字、标识符、注释
    一、认识计算机1、组成:硬件:cpu,内存,显卡,...软件:系统软件:WPS,wegame,steam,IDEA,.....应用软件:WPS,wegame,steam,IDEA,.....2、认识键盘:功能键:tap,空格,``飘号键快捷键:ctrl+a[c|v|x|z]3、DOS命令dircdxxx盘符:clsexit二、java环......
  • Java入门:08.Java中的static关键字01
    1static关键字可以修饰属性变量,方法和代码段static修饰的属性称为静态属性或类属性,在类加载时就在方法区为属性开辟存储空间,无论创建多少个对象,静态属性在内存中只有一份。可以使用类名.静态属性的方式引用static修饰的方法称为静态方法或类方法,在类加载时就在方法......
  • Java入门:08.Java中的static关键字02(拓展:单例模式)
    1.3对象代码段和静态代码段什么是代码段?就是个{}里面包含一堆代码代码段可以写在方法中,也可以写在方法外代码段可以方法中和方法外独立存在,也可以配合着分支结构和循环结构存在classA{ {   ..... }  publicvoidt1(){   { ......
  • 信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned 关键字、二进制、位
    信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned关键字、二进制、位运算、左移、右移、异或运算PDF文档公众号回复关键字:202409132023CSP-S阅读程序1判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>......
  • Java 并发编程深度解析:synchronized 关键字的内部原理与应用
    引言在并发编程中,当多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。Java是通过synchronized关键字实现锁功能来做到这点的,synchronized是JVM实现的一种内置锁,锁的获取和释放由JVM隐式实现。锁的本质如上图所示,多个线程要访问同一个资源。线程就......
  • mybatis exists 中使用代替in关键字
      使用场景,in适合数据量小的时候,exists适合数据量大的时候。<iftest="torqueRecordPageDTO.vinList!=nullandtorqueRecordPageDTO.vinList.size>0">andexists(select1from(<foreachcollection="......
  • 《深入理解 Java 中的 super 关键字》
    目录一、为什么需要super?二、super的理解及可调用结构(一)super是对父类的引用(二)super调用构造器三、子类对象实例化全过程一、为什么需要super?子类继承父类以后,可能会对父类的方法进行重写。在这种情况下,有时候我们需要在子类中调用父类中被重写的方法。此外,如果子类和......
  • 【Java】—— Java面向对象高级:抽象类与抽象方法(或abstract关键字)
    目录6.抽象类与抽象方法(或abstract关键字)6.1由来6.2语法格式6.3使用说明6.4注意事项练习:工资系统设计(1)MyDate类包含:(2)定义一个Employee类,该类包含:(3)定义SalariedEmployee类继承Employee类,(4)参照SalariedEmployee类定义HourlyEmployee类,(5)定义PayrollSystem类,......