QTableView利用代理设置某一关键字颜色变化,富文本显示

在写一个搜索软件时,需要将搜索元素设置成高亮显示
就像这样QTableView利用代理设置某一关键字颜色变化,富文本显示_第1张图片
想了很多办法,最后在https://stackoverflow.com/questions/1956542/how-to-make-item-view-render-rich-html-text-in-qt
这里找到答案。
首先自己定义一个类,继承QStyledItemDelegate类,重写其paint方法。
头文件

#ifndef MYDELEGATE_H
#define MYDELEGATE_H
#include 

class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    MyDelegate();
    void paint(QPainter *painter, const QStyleOptionViewItem &option,s const QModelIndex &index) const override;
};

#endif // MYDELEGATE_H

cpp文件

#include "mydelegate.h"
#include 
#include 
#include 
#include 
MyDelegate::MyDelegate()
{

}
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

    QStyleOptionViewItem optionV4 = option;
    initStyleOption(&optionV4, index);

    QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style();

    QTextDocument doc;
    doc.setHtml(optionV4.text);

    /// Painting item without text
    optionV4.text = QString();
    style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter);

    QAbstractTextDocumentLayout::PaintContext ctx;

    // Highlighting text if item is selected
    if (optionV4.state & QStyle::State_Selected)
           ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));

       QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
       painter->save();
       painter->translate(textRect.topLeft());
       painter->setClipRect(textRect.translated(-textRect.topLeft()));
       doc.documentLayout()->draw(painter, ctx);
       painter->restore();
}

然后设置代理

  MyDelegate *myDele = new MyDelegate;
  tableView->setItemDelegate(myDele);

最后在设置文字的时候就会支持富文本显示了

 //获取 条件对象 在文件名中第一次出现的位置 不区分大小写
    int index = fileName.indexOf(conditions,0,Qt::CaseInsensitive);
    //截取出文件名中与 条件对象 相等的一部分并进行替换  文件名Qt5.9.9  条件对象 qt5.9  结果  Qt5.9.9
    fileName.replace(conditions,QStringLiteral("").append(fileName.mid(index,conditions.size())).append(QStringLiteral("")),Qt::CaseInsensitive);
    fileNameItem->setText(fileName);

QTableView利用代理设置某一关键字颜色变化,富文本显示_第2张图片

你可能感兴趣的:(qt,qt5,qt)