QTreewidgetItem关键字高亮

思路为:给QTreeWidget添加QStyledItemDelegate委托,然后重新paint.代码可以优化,有兴趣的话。注意QTreeWidgetItem的text对齐方式为Qt::AlignCenter
#include "treewidget_styledItemDelegate.h"
#include <QPainter>
#include <QApplication>
#include <QStyle>


treewidget_styledItemDelegate::treewidget_styledItemDelegate()
{
}

/*!
 * \brief treewidget_styledItemDelegate::paint
 * \param painter
 * \param option
 * \param index
 */
void treewidget_styledItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
    QStyleOptionViewItem itemOption = option;

    initStyleOption( &itemOption,index );
    if (itemOption.state & QStyle::State_HasFocus)
    {
        //!--- 去掉选中时候的Item的虚线框,也就是焦点
       itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
    }

    QStyledItemDelegate::paint(painter, itemOption, index); //!-- 保持原有风格不变

    paint_keyword_highlight( painter,itemOption,index );
}

/*!
 * \brief treewidget_styledItemDelegate::paint_keyword_highlight
 * \param painter
 * \param itemOption
 * \param index
 */
void treewidget_styledItemDelegate::paint_keyword_highlight(QPainter *painter, const QStyleOptionViewItem &itemOption, const QModelIndex &index) const
{
    int ItemHeight = 0,ItemStringWidth = 0;
    int indexFindLeft = 0;
    int repaintTextWidth = 0;

    painter->save();
    const QWidget *m_QWidget = itemOption.widget;
    QStyle *m_QStyle = m_QWidget ? m_QWidget->style() : QApplication::style(); //!--- 得到当前的style
    QFontMetrics   m_QFontMetrics = painter->fontMetrics(); //!--- 得到这个painter的像素
    QString indexColString = ( index.model()->data(index,Qt::DisplayRole).toString() );

    QRect m_QRect = m_QStyle->subElementRect( QStyle::SE_ItemViewItemText,&itemOption,m_QWidget );//!--- 得到Item的自己的Rect

    QPalette::ColorRole textDisplayRole = QPalette::NoRole; //!--- 设置text的role
    if (itemOption.state & QStyle::State_Selected)
    {
        //!--- 当选中字体的时候字体显示高亮
        textDisplayRole = QPalette::HighlightedText;
    }

    ItemHeight = itemOption.rect.height();
    painter->translate( itemOption.rect.x(),itemOption.rect.y() );
    painter->setFont(QApplication::font(itemOption.widget));
    painter->setPen(itemOption.palette.brush(QPalette::Text).color());
    indexFindLeft = indexColString.indexOf( m_regFindKeyWords ); //!--- 得到查找字体在当前整个Item字体中的位置

    int findKeyWordWidth = m_QFontMetrics.width(m_regFindKeyWords); //!--- 得到查找字体的像素宽度
    int colTextWidth = m_QFontMetrics.width( itemOption.text ); //!--- 得到整个字体的像素宽度
    int preFindKeyWordWidth = m_QFontMetrics.width( indexColString.mid(0,indexFindLeft) ); //!-- 得到查找字体前面的字体的像素宽度


    m_QRect = m_QRect.adjusted( 0,0,ItemStringWidth,ItemHeight );
    QString drawLine = m_QFontMetrics.elidedText( indexColString, Qt::ElideMiddle, m_QRect.width()); //!--- 当字体超过Item的长度时显示为省略号

    //!--- 以下为绘制关键字
    if( index.column() >=0){
        if( indexFindLeft < 0 || m_regFindKeyWords == ""){
            this->displayText(indexColString,QLocale::Chinese);
        }
        if( indexFindLeft >= 0 && m_regFindKeyWords != ""){
            for( int i = 0 ; i < indexColString.length();++i){
                if( i < indexFindLeft  ){
                    this->displayText(drawLine.mid(0,indexFindLeft),QLocale::Chinese);
                    i = indexFindLeft;
                }else if(  i > ( indexFindLeft - 1 + m_regFindKeyWords.length() ) ){
                    this->displayText( drawLine.mid(indexFindLeft+m_regFindKeyWords.length(),indexColString.length()-m_regFindKeyWords.length()-indexFindLeft ),QLocale::Chinese);
                    i = indexColString.length();
                }else{
                    painter->setBackground(QBrush(Qt::green));
                    painter->setBackgroundMode( Qt::OpaqueMode );

                    if( colTextWidth == findKeyWordWidth ){
                        m_QStyle->drawItemText( painter,QRect( (itemOption.rect.width()-findKeyWordWidth)/2,0,findKeyWordWidth,ItemHeight),
                                                itemOption.displayAlignment ,QApplication::palette(),true, drawLine.mid( indexFindLeft,m_regFindKeyWords.length()),textDisplayRole );
                    }else if( colTextWidth < itemOption.rect.width() && colTextWidth != findKeyWordWidth ){
                        repaintTextWidth = ( (itemOption.rect.width()-colTextWidth)/2+preFindKeyWordWidth);
                        m_QStyle->drawItemText( painter,QRect( repaintTextWidth,0,findKeyWordWidth,ItemHeight),
                                                  itemOption.displayAlignment ,QApplication::palette(),true, drawLine.mid( indexFindLeft,m_regFindKeyWords.length()),textDisplayRole );
                    }else if( colTextWidth > itemOption.rect.width() ){
                        m_QStyle->drawItemText( painter,QRect( preFindKeyWordWidth+1,0,findKeyWordWidth,ItemHeight),
                                                  itemOption.displayAlignment ,QApplication::palette(),true, drawLine.mid( indexFindLeft,m_regFindKeyWords.length()),textDisplayRole );
                    }

                    i = indexFindLeft + m_regFindKeyWords.length();
                }
            }
        }
    }

    painter->restore();
}

/*!
 * \brief treewidget_styledItemDelegate::search_keyword 赋值关键字
 * \param regFindKeyWords
 */
void treewidget_styledItemDelegate::search_keyword(const QString &regFindKeyWords)
{
    if( m_regFindKeyWords.length() > 0 ) m_regFindKeyWords.clear();
    m_regFindKeyWords = regFindKeyWords;
}



你可能感兴趣的:(Qt关键字高亮)