通过 QStyledItemDelegate 以不同颜色显示 QTableWidgetItem 的文本
Displaying QTableWidgetItem's text with different colors via a QStyledItemDelegate
我想用不同的颜色显示 QTableWidgetItem
的部分文本(其中的一部分应该显示为红色)。
我发现使用 QStyledItemDelegate
,重新实现 paint
函数并显示 QTextDocument
,它使用项目文本并添加 HTML.
这将为文本启用 HTML:
void DifferencesDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
painter->save();
QTextDocument document;
document.setHtml(index.data().toString());
document.setPageSize(option.rect.size());
QAbstractTextDocumentLayout::PaintContext context;
painter->translate(option.rect.x(), option.rect.y());
document.documentLayout()->draw(painter, context);
painter->restore();
}
然而,与 "normal" 显示相比,结果有一些像素偏移(这很可能以某种方式以一致的方式修复),但我想知道是否有更简单的方法。我根本不需要HTML,我只是想更改文本某些部分的颜色。
那么是否可以在不使用 QTextDocument
的情况下绘制项目的文本(逐个字母)并设置每个字母的颜色?
我认为在 Qt 中没有标准的方法来绘制这些东西。看看下面的代码。您可以绘制文本的每个特定字符。在这种情况下,您应该手动计算角色绘制位置 opt.rect
。但它有效。在示例中,字符有红色和绿色。
void DifferencesDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
const QModelIndex& index ) const
{
painter->save();
QColor colors[2] = {Qt::red, Qt::green};
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
opt.text.clear();
QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
QString text = index.data().toString();
for (int i = 0, t = text.count(); i < t; ++i)
{
opt.text = text[i];
painter->setPen(QColor(colors[i % 2]));
opt.rect.moveRight(opt.rect.right() + 10); // <-- calculate the character paint place
style->drawItemText(painter, opt.rect, opt.displayAlignment, opt.palette, true,
opt.text);
}
painter->restore();
}
我想用不同的颜色显示 QTableWidgetItem
的部分文本(其中的一部分应该显示为红色)。
我发现使用 QStyledItemDelegate
,重新实现 paint
函数并显示 QTextDocument
,它使用项目文本并添加 HTML.
这将为文本启用 HTML:
void DifferencesDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
painter->save();
QTextDocument document;
document.setHtml(index.data().toString());
document.setPageSize(option.rect.size());
QAbstractTextDocumentLayout::PaintContext context;
painter->translate(option.rect.x(), option.rect.y());
document.documentLayout()->draw(painter, context);
painter->restore();
}
然而,与 "normal" 显示相比,结果有一些像素偏移(这很可能以某种方式以一致的方式修复),但我想知道是否有更简单的方法。我根本不需要HTML,我只是想更改文本某些部分的颜色。
那么是否可以在不使用 QTextDocument
的情况下绘制项目的文本(逐个字母)并设置每个字母的颜色?
我认为在 Qt 中没有标准的方法来绘制这些东西。看看下面的代码。您可以绘制文本的每个特定字符。在这种情况下,您应该手动计算角色绘制位置 opt.rect
。但它有效。在示例中,字符有红色和绿色。
void DifferencesDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
const QModelIndex& index ) const
{
painter->save();
QColor colors[2] = {Qt::red, Qt::green};
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
opt.text.clear();
QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
QString text = index.data().toString();
for (int i = 0, t = text.count(); i < t; ++i)
{
opt.text = text[i];
painter->setPen(QColor(colors[i % 2]));
opt.rect.moveRight(opt.rect.right() + 10); // <-- calculate the character paint place
style->drawItemText(painter, opt.rect, opt.displayAlignment, opt.palette, true,
opt.text);
}
painter->restore();
}