さて、次のようなペイント メソッドを再実装するカスタム デリゲートを使用して、デリゲートを使用して qtableview でリッチ テキストをレンダリングできます。
void CHtmlDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV4 opt(option);
QLabel *label = new QLabel;
label->setText(index.data().toString());
label->setTextFormat(Qt::RichText);
label->setGeometry(option.rect);
label->setStyleSheet("QLabel { background-color : transparent; }");
painter->translate(option.rect.topLeft());
label->render(painter);
painter->translate(-option.rect.topLeft());
}
ただし、ハイパーリンクをクリック可能にすることはできません。
これを行うには、次のハックを使用できます。テーブル/リスト ビューの setModel メソッドを再実装し、setIndexWidget を使用します。
void MyView::setModel(QAbstractItemModel *m)
{
if (!m)
return;
QTableView::setModel(m);
const int rows = model()->rowCount();
for (int i = 0; i < rows; ++i)
{
QModelIndex idx = model()->index(i, 1);
QLabel *label = new QLabel;
label->setTextFormat(Qt::RichText);
label->setText(model()->data(idx, CTableModel::HtmlRole).toString());
label->setOpenExternalLinks(true);
setIndexWidget(idx, label);
}
}
上記の例では、列 1 を qlabels に置き換えます。データの重複を避けるために、モデルの表示ロールを無効にする必要があることに注意してください。
とにかく、デリゲートに基づくより良いソリューションに興味があります。