在qt的QTableView列中添加两种不同颜色的文本

时间:2013-10-01 12:48:25

标签: qt qtableview qabstracttablemodel

我正在使用QTableView在我的应用程序中显示用户活动。

我的模型包含四列,每列显示不同类型的文本,如:

  • 第1栏中的用户名
  • 第二栏中的用户活动
  • 第3栏中的活动详情

我想在单个列中显示第2列和第3列的文本,其中不同的文本颜色用“ - ”分隔。

我的应用目前看起来像这样:

enter image description here

但是,我希望它看起来与此类似

enter image description here

有人可以帮我解决这个问题,提前谢谢

2 个答案:

答案 0 :(得分:1)

我会分两个步骤来讨论这个话题:

  1. 以第2列和第3列为单列的方式更改模型,但旧第2列的值以Qt:DisplayRole(标准方式)返回,并且Qt::SomeUserRole <返回旧第3列的值/ LI>
  2. 将委托添加到表视图,该视图将处理合并列的可视化并以“gmail”样式显示项目。可视化的值使用上一步中的相应角色值从模型中获取。
  3. 您还可以将整个事物视为具有许多不同数据角色的列表:每行作为单个项目(这可以在qml中非常好地处理)。

答案 1 :(得分:1)

您可以覆盖模型的data方法,并使用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();
}

如果不清楚,请随意询问。