Отображение текста QTableWidgetItem с разными цветами через QStyledItemDelegate - PullRequest
0 голосов
/ 05 апреля 2019

Я хочу отобразить части текста 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();
}

Однако результат имеет смещение в несколько пикселей по сравнению с«нормальный» дисплей (который, скорее всего, может быть исправлен каким-то непротиворечивым образом), но мне интересно, есть ли более простой способ.HTML мне вообще не нужен, я просто хочу изменить цвет какой-либо части текста.

Так что можно нарисовать текст элемента (буква за буквой) и установить цвет для каждой буквыбез использования QTextDocument?

1 Ответ

1 голос
/ 05 апреля 2019

Я думаю, что нет стандартного способа рисовать такие вещи в 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();
}
...