Я хочу отобразить два столбца внутри QTableWidget
, показывающих различия между двумя значениями (рассчитанные ранее некоторыми алгоритмами расстояния Левенштейна). Части хранятся внутри данных каждого QTableWidgetItem
, как QStringList
. Первая часть должна отображаться черным, следующая - красным, а затем снова чередоваться черным, красным и т. Д.
Для этой цели я реализовал QStyledItemDelegate
с пользовательской функцией paint()
, которая в конечном итоге вызывает метод drawText()
:
void DifferencesDelegate::drawText(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
painter->save();
const QPen defaultPen = painter->pen();
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);
opt.rect.moveRight(opt.rect.right() + 3);
int color = 1;
for (const QString &part : index.data(Qt::UserRole).toStringList()) {
color++;
color = color % 2;
if (color) {
painter->setPen(Qt::red);
} else {
painter->setPen(defaultPen);
}
style->drawItemText(painter, opt.rect, opt.displayAlignment, opt.palette, true, part);
opt.rect.moveRight(opt.rect.right() + painter->fontMetrics().width(part));
}
painter->restore();
}
Это приводит к правильной окраске, пока ширина столбца достаточна:
но как только столбец становится меньше, я получаю грязное переполнение:
Это, безусловно, вызвано применением opt.rect
для каждой части экрана, но не для текста в целом.
Единственная проблема в том, что я понятия не имею, как это исправить ;-) Любая помощь будет принята с благодарностью! Заранее спасибо!