天天看點

Qt 之 QTableView 顯示富文本

簡述

對于QTableView中的顯示,我們前面介紹過很多種,其中包括:文本、進度條、複選框等,今天我們介紹一下關于富文本的顯示。

可能絕大多數小夥伴會通過QAbstractTableModel中的data來實作,可是現實告訴我們,那是行不通的,那麼我們如何去顯示呢?請看正文。

| 版權聲明:一去、二三裡,未經部落客允許不得轉載。

效果

Qt 之 QTableView 顯示富文本

源碼

void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem viewOption(option);
    initStyleOption(&viewOption, index);
    if (option.state.testFlag(QStyle::State_HasFocus))
        viewOption.state = viewOption.state ^ QStyle::State_HasFocus;

    // ... 省略
    // 設定顯示文本為空,使用預設樣式
    QStyle *pStyle = viewOption.widget? viewOption.widget->style() : QApplication::style();

    viewOption.text = "";
    pStyle->drawControl(QStyle::CE_ItemViewItem, &viewOption, painter, viewOption.widget);

    // 需要顯示的HTML
    QString strHTML = QString("<html> \
                              <head> \
                              <style>font{font-size:18px; color:white;} #f{font-size:26px; color: green;}</style> \
                              </head> \
                              <body>\
                              <font>%1</font><font id=\"f\">%2</font> \
                              <img src=\":/Images/logo\" width=\"40\" height=\"40\"> \
                              </body> \
                              </html>").arg("I am a ").arg("Qter");

    QTextDocument doc;
    doc.setHtml(strHTML);

    QAbstractTextDocumentLayout::PaintContext paintContext;

    QRect textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText, &viewOption);
    painter->save();
    // 坐标變換,将左上角設定為原點
    painter->translate(textRect.topLeft());
    // 設定HTML繪制區域
    painter->setClipRect(textRect.translated(-textRect.topLeft()));

    doc.documentLayout()->draw(painter, paintContext);
    painter->restore();
}      

分析

繼續閱讀