【问题标题】:QTableView- overriding CSS in QAbstractTableModelQTableView - 覆盖 QAbstractTableModel 中的 CSS
【发布时间】:2016-05-25 23:56:15
【问题描述】:

我正在为我们的产品使用常见的 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 中获取颜色的。 任何帮助将不胜感激。

【问题讨论】:

    标签: qt qtableview qabstracttablemodel


    【解决方案1】:

    我对@9​​87654322@ 进行了以下更改,本质上是QSqlTableModel,子类为CustomSqlTableModel,以允许覆盖setData() 并提交,并添加自定义刷新功能。对于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);
    }
    

    我还建议您对小部件进行更具体的处理。将您确实希望 stylesheet 影响的所有 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;
    }
    

    如果这对你有帮助,请告诉我...

    【讨论】:

    • 日番谷198:感谢您的回复。以红色显示文本颜色是基于条件的,因此,我无法在样式表中进行更改。在正常情况下,我希望我的表格看起来与我的所有其他表格(应用了 css)相同,但是,在某些情况下,我想以红色显示文本。我尝试从数据函数返回红色作为 QVariant。但是,这似乎不起作用。即使我尝试更改表的对象名称并应用其中没有颜色的不同样式表,但在这种情况下,颜色会从父表继承。有没有其他方法可以覆盖它?
    • 我认为,首先将其从样式表中拆分出来(或暂时从样式表中删除颜色元素)。如果这不起作用,请尝试从子类 QTableView 中调用以下两行:style()->unpolish(this);样式()->抛光(这个);我对需要运行时颜色更改的文本框、旋转框和表格视图执行此操作。需要明确的是,子类化这个tableview,并使颜色更改成为视图的功能。当您刷新视图时(当 AbstractTableView 触发 dataChanged 或 modelReset 信号时,调用上述行。
    • 当样式表中没有颜色元素时,返回颜色作为 Qvariant 有效,但是,我的要求是在某些情况下使用样式表并覆盖颜色。
    • 我有另一个想法,但文字太多,无法放入评论中。试试这个 collabedit 链接。 CollabEdit会在那里和你聊天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2017-12-18
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多