QTreeView复选框颜色

时间:2019-07-18 13:48:59

标签: qt5

我正在尝试像这样在QTreeView的复选框中添加颜色

Colored checkboxes

我从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}“做吗?

1 个答案:

答案 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提供的样式或主题。我没有解决这个问题的方法。我仍然愿意寻求更好的解决方案!