Qt - 带代表的QTableview行颜色

时间:2017-02-11 19:32:05

标签: c++ qt qtableview

我对QTableView的行着色有一个非常具体的问题,主要问题是着色整行的背景,还使用不同列上的委托,这是我试过的:

  • 实现自定义数据模型的data():此实现的问题在于,当着色发生时,自定义委托(对于列)的背景不会改变。
  • 为行实现QStyledItemDelegate,此方法适用于着色,问题是我无法为该特定行分配任何其他列委托。
  • 为列实现QStyledItemDelegate,画家填充整行的rectangle,这对我来说几乎是正确的,所有列都是彩色的,问题是,在调整大小时,我得到剪裁和有时,背景颜色会消失在其他列上,屏幕截图如下。

Picture when the colors are working

Picture after resizing, after clipping, it sometimes stops to this, can be fixed by defocusing the main window (click outside of it), accessing the context menu and other things like that

问题是某些列使用默认编辑器/委托,而有些列使用自定义编辑器/委托。

问题是,实现这一目标的最佳方法是什么?

或者,我可以绘制整行并限制其他代表重新绘制背景吗?

1 个答案:

答案 0 :(得分:0)

我设法找到了解决方案:

我的主要问题是我的代表没有从模型中获取背景颜色来绘制它,我通过从QItemDelegate实现复制背景的实现来解决这个问题,我需要的代码片段我的自定义委托的paint()方法中的实现是:

    // draw the background color
if (option.showDecorationSelected && (option.state & QStyle::State_Selected)) {
    QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
                              ? QPalette::Normal : QPalette::Disabled;
    painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight));
} else {
    QVariant value = index.data(Qt::BackgroundColorRole);
    if (value.isValid() && qvariant_cast<QColor>(value).isValid())
        painter->fillRect(option.rect, qvariant_cast<QColor>(value));
}

有了这个,我现在可以从模型中获取颜色并绘制委托背景。