使用QStyleItemDelegate自定义文本委托

1. 重写paint虚函数,实现绘制自定义富文本

该虚函数实现在同一个字符串文本中对不同的子字符串设置不同的显示样式,采用html 的方式来显示文本;自定义的委托类需要继承自QStyleItemDelegate类:

void CRichTextDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem  styleOptionViewItem( option );
    initStyleOption( &styleOptionViewItem, index);
    QStyle *pStyle = styleOptionViewItem.widget ? styleOptionViewItem.widget->style() : QApplication::style();
    styleOptionViewItem.text = "";
    pStyle->drawControl(QStyle::CE_ItemViewItem, &styleOptionViewItem, painter,  styleOptionViewItem.widget);


     QTextDocument  textDoc;
     //设置文字居中显示
     textDoc.setTextWidth(option.rect.width());
     textDoc.setDefaultTextOption(Qt::AlignCenter);
     //设置文本内容
     textDoc.setHtml("This is some text!");

     QAbstractTextDocumentLayout::PaintContext   paintContext;
     QRect  textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText,  &styleOptionViewItem);
     QPoint point( option.rect.topLeft() + QPoint(50,option.rect.height() / 2 -textRect.height() / 2 ) );
     painter->save();
     painter->translate( point  );
     painter->setClipRect( textRect.translated( -point ) );
     textDoc.documentLayout()->draw( painter, paintContext);
     painter->restore();
}
2.自定义委托类实现在QTableWidget中自定义每一行的字体样式

自定义类需要继承自QStyleItemDelegate类并重写虚函数paint:

#include
#include
#include
#include
#include
void CTableRowsTextColorDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    //获取值
    const QString strValue = index.model()->data(index,Qt::DisplayRole).toString();

    //设置字体样式和颜色
    QPen pen(Qt::red);
    painter->setPen(pen);
    painter->setFont( QFont("Times",10,QFont::Bold));

    //绘制背景样式
    QStyleOptionViewItem myOption = option;
    myOption.text = "";
    QStyle *pStyle = myOption.widget ? myOption.widget->style() : QApplication::style();
    pStyle->drawControl(QStyle::CE_ItemViewItem,&myOption,painter,option.widget);

    //绘制文本
    pStyle->drawItemText(painter,option.rect,Qt::AlignCenter,QApplication::palette(),true,strValue);

}

你可能感兴趣的:(QT知识积累,自定义委托)