如何为 QTableView 中的当前项目设置样式表

Posted

技术标签:

【中文标题】如何为 QTableView 中的当前项目设置样式表【英文标题】:How to set stylesheet for the current item in QTableView 【发布时间】:2014-07-19 06:30:51 【问题描述】:

QTableView 编辑控件对当前项目可见时,编辑的样式表就会发生。当QTableView 中没有活动的编辑控件时,当前项使用QTableView selection-background-color: 设置样式如何仅为当前项设置不同的样式?

【问题讨论】:

【参考方案1】:

1。正如 IGHOR 所说,您可以在模型中使用 data() 方法并在角色为 Qt::BackgroundColor 时提供颜色。但是这里有一个绊脚石,因为您不知道 index 是否是最新的。您应该在模型更改时在模型中设置一个当前索引,然后进行如下检查:

if (index == m_currentIndex and role==Qt::BackgroundRole) return Qt::black;

实际上,根据模型/视图模式告诉模型currentIndex并不是最好的主意,因为一个模型可以有两个视图。

2。 QAbstractItemView 的后代有方法 setItemDelegate。委托用于绘制单元格。 您只需要从 QStyledItemDelegate 继承,将指向视图的指针传递给委托并覆盖方法 initStyleOption。 然后做这样的事情:

void MyStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option,
   const QModelIndex &index) const

  QStyledItemDelegate::initStyleOption(option, index);
  QStyleOptionViewItemV4 *v4 = qstyleoption_cast<QStyleOptionViewItemV4 *>(option);
  if (index == view()->currentIndex())
  
      v4->backgroundBrush = QBrush(Qt::grey);
  

3如果你真的需要使用 css(例如你有主题)你可以这样做:

在你的css文件中添加这样的东西:

QTableView  
  
  qproperty-currentItemBackground: #cccccc;  
  

修改上例中的 initStyleOption 以使用该属性:

v4->backgroundBrush = view()->property("currentItemBackground").toColor();  

使用这种方法,您可以通过 css 为列、行、单个单元格或一组单元格设置特定样式。

【讨论】:

尝试了#3,我不会推荐这种方法。代表是要走的路【参考方案2】:

您需要创建一个新的委托,它根据数据模型(例如自定义角色)呈现自身。您需要将其样式基于为此目的而创建的特殊控件(可以通过样式表进行更改)。有时间我会贴一些代码。

可以使用可变参数模板,并且crtp(Coplien)对layer one的delegate有很好的效果

【讨论】:

【参考方案3】:

Qt 样式表支持子控件和伪状态,您可以使用它来改进您的自定义。 (见http://qt-project.org/doc/qt-5/stylesheet-reference.html#list-of-pseudo-states)

在这种情况下,您可以使用::item 子控件和:focus 伪状态(“当前”伪状态不存在,但:focus 也是如此)。

这是一个您可以使用的示例:

QTableView::item:focus

   selection-background-color: yellow;

另见http://qt-project.org/doc/qt-5/stylesheet-examples.html#customizing-qtreeview

【讨论】:

到目前为止,似乎只有法比奥阅读了这个问题。然而,这个解决方案可能适用于 QTreeView,但不幸的是不适用于 QTableView。 @UgaBuga。有什么问题?在发布我的答案之前,我已经在 QTableView 中进行了测试,它可以工作。 幸运的是你是对的。您的解决方案适用于空白项目。我的大项目中似乎存在样式问题,我应该进一步研究。 但是它适用于选择,但仍然无法仅对当前项目实现。 它有效,但前提是表格有焦点。当表格失去焦点时,所有选择变为灰色,无法区分当前项目。

以上是关于如何为 QTableView 中的当前项目设置样式表的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个 QTableView 单元格支持两个单独的可双击值?

如何为 .NET 项目自定义强制代码样式规则

如何为 .NET 项目自定义强制代码样式规则 #yyds干货盘点#

WPF Grid - 如何为一列应用样式?

如何为表格中的一行设置样式?

Vs Blend + Windows 8:如何为应用程序中的元素设置系统通知主题的样式?