QTreewidgetItem关键字高亮
来源:互联网 发布:印度与中国知乎 编辑:程序博客网 时间:2024/05/17 09:18
思路为:给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 ®FindKeyWords){ if( m_regFindKeyWords.length() > 0 ) m_regFindKeyWords.clear(); m_regFindKeyWords = regFindKeyWords;}
欢迎加入QQ群:259787236进行讨论。
0 0
- QTreewidgetItem关键字高亮
- lucene高亮关键字
- lucene 关键字高亮
- ASP高亮关键字
- 高亮显示关键字
- 高亮显示关键字
- Java高亮关键字
- 高亮显示关键字
- 高亮显示关键字
- jquery高亮关键字
- vim高亮关键字
- 关键字高亮显示
- 关键字高亮显示
- qt关键字高亮
- 关键字高亮显示
- 搜索关键字高亮
- C#高亮关键字
- 关键字高亮
- Swift学习笔记(十八)泛型
- TCP状态转移图学习总结
- Cordys连接JDBC ODBC 需把 JDBC Jar放到CLASSPATH环境变量中
- struts2 java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
- hdoj 4324 (Triangle LOVE )拓扑排序判断成环
- QTreewidgetItem关键字高亮
- python的二进制文件读写
- 在C#中.cs文件 .xaml文件 .config文件 .asax各是干什么的
- Android在走下坡路吗?
- SolrCloud搭建
- 设置圆角按钮按下时背景改变
- Netty入门到精通课程|物联网视频教程
- Gauss消去法求线性方程组
- 双4G LTE