2013-10-01 2 views
2

Я использую QTableView для отображения активности пользователя в своем приложении.добавить текст с двумя разными цветами в столбце QTableView в qt

Моя модель содержит четыре колонки, каждый столбец отображает другой тип текста, как:

  • пользователя в 1-й колонке
  • активности пользователя во 2-й колонке
  • подробности деятельности в 3-м столбце

Я хочу отображать как текст 2-го, так и 3-го столбцов в одном столбце с другим цветом текста, разделенным «-».

Моя заявка в настоящее время выглядит следующим образом:

enter image description here

Однако, я хочу, чтобы выглядеть подобно этому

enter image description here

Может кто-то пожалуйста, помогите мне решить это, благодаря заранее

ответ

1

Я бы подошел к этой теме в два этапа:

  1. модель изменения таким образом, что второй и 3-й столбцы имеют один столбец, но значение от старого 2-го столбца возвращается как Qt:DisplayRole (стандартно) и значением из старого 3-го столбца возвращается для Qt::SomeUserRole
  2. Добавить делегата который будет обрабатывать визуализацию объединенных столбцов и элемент отображения в стиле «gmail». Значения для визуализации выбираются с использованием соответствующих значений роли с предыдущего шага.

Вы также можете рассматривать все это как список с множеством разных ролей данных: каждая строка как отдельный элемент (это можно обрабатывать очень красиво в qml).

1

Вы можете переопределить метод вашей модели и вернуть пользовательский цвет Qt::ForegroundRole для необходимых столбцов.

Но если вам нравится визуализация «gmail», вы должны создать свой собственный делегат (как было предложено @Marek). Вы можете использовать QTextDocument для расширенного рендеринга текста. Псевдокод:

void QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 
{ 
    painter->save(); 

    const QString title = index.model()->data(YourTitleRoleId).toString(); 
    const QString content = index.model()->data(YourContentRoleId).toString(); 
    // Use any qt-supported html tags 
    const QString html = QString("<html><b>%1</b> - <i>%2</i></html>").arg(title).arg(content); 
    QTextDocument doc; 
    doc.setHtml(html); 
    QRectF rc(option.rect); 
    doc.drawContents(painter, rc); 

    painter->restore(); 
} 

Не стесняйтесь спрашивать, если что-то неясно.

+0

Я попытался повторить ваш пример здесь. Я проверил, что мой HTML действителен, однако я получаю пустую ячейку в моем представлении таблицы. Вы уверены, что это правильно? –

+0

Я использовал 'painter-> translate' и' QRect' как подробно [здесь] (http://stackoverflow.com/questions/17114944/qstyleditemdelegate-rendering-qtextdocument-rich-text-doesnt-alignhcenter), и это сработало –

+0

@SteveLorimer Что такое "valid html"? Qt поддерживает только ограниченное подмножество html. См. Документы. –

 Смежные вопросы

  • Нет связанных вопросов^_^