QTableView- 在QAbstractTableModel中覆盖CSS

4

我正在为我们的产品使用通用CSS,其中包含以下QTableView模板:

QTableView::item
{
    padding-left:10px;
    height:40px;
    width:80px;
    color: #5a5a5a;
    border-bottom :1px solid #f0f0f0;
}

有一个需求,我想把QTableView的文本颜色改成红色。我正在通过在QAbstractTableModel的数据函数中使用以下代码来实现:

if (role == Qt::TextColorRole || role == Qt::ForegroundRole)
    {
        QColor color(Qt::red);
        QBrush brush (color);
        brush.setStyle(Qt::SolidPattern);
        return brush;
    }

但是,文本的颜色没有改变,它是从 CSS 中获取颜色的。非常感谢您的帮助。

1个回答

1
我针对文本颜色进行了以下更改,在本质上是QSqlTableModel,子类化为CustomSqlTableModel以允许覆盖setData()和submit,并添加自定义刷新功能。 对于QAbstractItemModel实例,以下内容应该同样适用:
QVariant ExampleSqlTableModel::data(const QModelIndex &idx, int role) const
{
  if (role == Qt::ForegroundRole)
  {
    QColor color;
    // Only the display names need to be coloured.
    if(idx.column() == 1)
    {
      int value = CustomSqlTableModel::data(1, Qt::DisplayRole).toInt();
      switch(value)
      {
        case 0:         color = QColor(Qt::yellow); break; 
        case 1:         // same as 2
        case 2:         color = QColor(Qt::blue);   break; 
        case 3:         color = QColor(Qt::green);  break; 
        case 4:         // same as 5
        case 5:         color = QColor(Qt::red);    break; 
        default:        color = QColor(Qt::black);  break; 
      }
    }
    return QVariant(color);
  }
  return CustomSqlTableModel::data(idx,role);
}

我建议您对小部件进行更具体的说明。对于所有要应用样式表的QTableView实例进行子类化,并且如果会影响文本颜色,则不要将一般的stylesheet应用于QTableView
这样,如果所有其他QTableViews都已经被子类化为myAwesomeTableView,那么您可以替换您的stylesheet内容为:
myAwesomeTableView::item
{
    padding-left:10px;
    height:40px;
    width:80px;
    color: #5a5a5a;
    border-bottom :1px solid #f0f0f0;
}

如果你想让另一个 QTableView 始终显示红色文本,那么最好定义第二个子类,并通过 stylesheet 处理它,而不是像我这样在代码中实现。我需要在单个列上根据该列中的值使不同行具有不同的文本颜色。要通过 stylesheet 实现这一点,可以创建另一个 QTableView 子类,例如 myOtherAwesomeTableView,并按以下方式实现 stylesheet

myOtherAwesomeTableView::item
{
    padding-left:10px;
    height:40px;
    width:80px;
    color: #ff0000;
    border-bottom :1px solid #f0f0f0;
}

请告诉我这是否对您有帮助...

Hitsugaya198:感谢您的回复。将文本颜色显示为红色是基于条件的,因此我不能在样式表中进行更改。在正常情况下,我希望我的表格看起来与我所有其他已应用 CSS 样式的表格相同,但在某些条件下,我想要以红色显示文本。我尝试从数据函数返回红色作为 QVariant,但似乎不起作用。即使我尝试更改表格的对象名称并应用不包含颜色的不同样式表,但在这种情况下,颜色会从父表继承。是否有其他方法可以覆盖它? - manoj kumar
我认为,首先从样式表中拆分它(或者暂时从样式表中删除颜色元素)。如果这不起作用,请尝试从子类化的QTableView中调用以下两行:style()->unpolish(this); style()->polish( this );我对需要运行时颜色更改的文本框、旋转框和表格视图执行此操作。要明确,子类化此一个tableview,并使颜色更改成为视图函数。当视图刷新时(当AbstractTableView触发dataChanged或modelReset信号时),调用上述行。 - Louis Parkin
当样式表中没有颜色元素时,将颜色作为QVariant返回是有效的。但是,我的要求是在某些条件下使用样式表并覆盖颜色。 - manoj kumar
我有另一个想法,但是在评论中无法容纳太多文本。请尝试使用此CollabEdit链接。CollabEdit 我们可以在那里聊天。 - Louis Parkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接