Qt - QTableview 行颜色与代表
Qt - QTableview row color with delegates
我对 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
问题是有些列使用默认 editor/delegate,有些使用自定义列。
问题是,实现它的最佳方法是什么?
或者,我可以绘制整行并限制其他代表重新绘制他们的背景吗?
我设法找到了解决方案:
我的主要问题是我的代表没有从模型中获取背景颜色来绘制它,我通过从 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));
}
有了这个,我现在可以从模型中提取颜色并绘制代表背景。
我对 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
问题是有些列使用默认 editor/delegate,有些使用自定义列。
问题是,实现它的最佳方法是什么?
或者,我可以绘制整行并限制其他代表重新绘制他们的背景吗?
我设法找到了解决方案:
我的主要问题是我的代表没有从模型中获取背景颜色来绘制它,我通过从 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));
}
有了这个,我现在可以从模型中提取颜色并绘制代表背景。