我正在尝试像这样在QTreeView
的复选框中添加颜色
我从QStyledItemDelegate
切换到QItemDelegate
以更好地控制绘图过程,主要是使用drawCheck
方法。我不能让画家画我想要的颜色。使用css,我成功更改了所有复选框的颜色,但是我需要根据某些属性选择颜色(此处不重要)。修改QTreeView的QStyle可能可以,但是我将遇到相同的“唯一颜色”问题。
修改画家或选项参数无济于事。
painter->setPen(aRandomColor);
auto coloredOption = option;
coloredOption.backgroundBrush.setColor(aRandomColor);
QItemDelegate::drawCheck(painter, coloredOption, rect, state);
我了解我可以在不调用drawCheck
的情况下以自己的QItemDelegate::drawCheck
处理整个绘图过程
const auto color = wathever;
draw square outline using color
draw filled square using color
// Do NOT call QItemDelegate::drawCheck(...)
但是这将在所有操作系统上强制一致的感觉。没有办法要求背景颜色吗?像...画出要画的东西,但是用{color}“做吗?
答案 0 :(得分:0)
我测试了所有可以找到的成员,但无济于事。所以我做了我不想做的事情:自己处理绘图过程。
void ActionsItemDelegate::drawCheck(QPainter *painter, ...) {
if (thisCheckboxNeedsColoring) {
painter->setPen(dynamicColor);
#ifdef __APPLE__
painter->setRenderHint(QPainter::Antialiasing);
QPainterPath path;
path.addRoundedRect(QRectF(rect.adjusted(3, 3, -4, -3)), 1.0, 1.0);
painter->fillPath(path, color);
painter->drawPath(path);
if (state != Qt::Unchecked)
{
painter->fillRect(rect.adjusted(5, 8, -6, -8), Qt::white);
}
#else
painter->drawRect(rect.adjusted(0, 0, -1, -1));
if (state != Qt::Unchecked)
{
painter->fillRect(rect.adjusted(3, 3, -3, -3), color);
}
#endif
} else {
QItemDelegate::drawCheck(painter, option, rect, state);
}
}
当然,这没有考虑Windows,Linux和macOS提供的样式或主题。我没有解决这个问题的方法。我仍然愿意寻求更好的解决方案!