QTreeView自定义项目显示委托和CSS

时间:2017-02-08 12:39:05

标签: css qt delegates qtreeview

我有一个QTreeView显示我的数据,我已经在其中一个列上安装了一个自定义委托来显示彩色进度条,其外观取决于内容。我能够使用option.palette提供的颜色信息模拟默认委托行为:

class ProgressBarDelegate : public QStyledItemDelegate
{
public:
    ProgressBarDelegate(QObject *parent = 0) {}
    ~ProgressBarDelegate() {}
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        // QStyledItemDelegate::paint(painter, option, index); // default implementation

        painter->save();

        // progressbar construction and drawing

        painter->restore();
    }
};

现在,我想在鼠标悬停事件中突出显示一行。我将自定义CSS设置为树视图:

ui->treeView->setStyleSheet("QTreeView::item:hover{background-color:#D0E0F0;}");

悬停突出显示有效,但是,我的自定义委托实现会忽略CSS设置:

Without defaulte delegate

(Darkblue行是选中的项目,lightblue-ish行是CSS悬停突出显示的行)

启用默认实现允许CSS设置影响我的委托,但它弄乱了图片:

With default delegate

问题是:

  • 有没有办法知道代表的重写CSS设置数据? option.palette似乎不包含此信息。

我尝试按照here

读取QTreeView属性
qDebug() << treeView()->property("background");

但控制台显示QVariant(Invalid)

我还尝试阅读drawControl()drawPrimitive()方法的Qt源代码,这些方法在默认委托实现中使用,但我设法只找到小部件调色板引用,并且没有与CSS覆盖的连接

2 个答案:

答案 0 :(得分:1)

在阅读source之后我发现显然,默认情况下没有办法从委托中访问CSS数据,因为CSS解析和计算是由私有QStyleSheetStyle对象处理的,应用程序没有可以直接访问。此对象只是修改绘制例程要使用的相应option.palette字段。

但是,有一种方法可以强制委托使用所需的设置绘制一些元素,而无需通过调用样式的option.palette方法手动解析drawPrimitive()字段:

// drawing background with desired colors:
option.widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter);

此方法将使用相应的设置绘制背景:

somewhat acceptable

认为应该采用类似的方法强制使用CSS修改后的设置,其中包含以下内容:

option.widget->style()->proxy()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter);
然而,由于缺乏对Qt风格框架内部运作的理解,我还没有找到它。

答案 1 :(得分:0)

当您在paint方法中绘制组件时,可以绘制“悬停”效果

您可以使用以下内容:

// detect the hover
QStyleOptionViewItemV4 styleOption(option);
bool mouseOver = (styleOption.state & QStyle::State_MouseOver);
// draw if hovered    
if(mouseOver) {
...
}