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

时间:2014-05-29 16:52:43

标签: qt qt5 qtableview qtstylesheets

如果当前项目显示QTableView编辑控件,则会发生编辑的shylesheet。当QTableView中没有活动的编辑控件时,使用QTableView { selection-background-color: }如何仅为当前项设置不同的样式来设置当前项的样式?

Current item visible only when QTableView has focus   Active edit-box on the current item

3 个答案:

答案 0 :(得分:14)

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;
}

enter image description here

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

答案 1 :(得分: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为列,行,单个单元格或一组单元格设置特定样式。

答案 2 :(得分:0)

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

可以使用可变参数模板,并且crtp(Coplien)对第一层的代表具有良好的效果