簡述
對于QTableView中的顯示,我們前面介紹過很多種,其中包括:文本、進度條、複選框等,今天我們介紹一下關于富文本的顯示。
可能絕大多數小夥伴會通過QAbstractTableModel中的data來實作,可是現實告訴我們,那是行不通的,那麼我們如何去顯示呢?請看正文。
| 版權聲明:一去、二三裡,未經部落客允許不得轉載。
效果
源碼
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();
}