【问题标题】:QTreeView custom item display delegate and CSSQTreeView 自定义项显示委托和 CSS
【发布时间】:2017-06-26 02:04:21
【问题描述】:

我有一个 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 设置:

(深蓝色线为选中项,浅蓝色线为 CSS 悬停高亮线)

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

问题是:

  • 有什么方法可以从委托中获知覆盖的 CSS 设置数据? option.palette 似乎不包含此信息。

我已尝试读取 QTreeView 属性,描述为 here:

qDebug() << treeView()->property("background");

但控制台显示QVariant(Invalid)

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

【问题讨论】:

    标签: css qt delegates qtreeview


    【解决方案1】:

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

    你可以这样使用:

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

    【讨论】:

    • 是的,我真的希望我不需要手动检测所有需要的状态。我想我毕竟必须实施你的解决方案。
    【解决方案2】:

    阅读source 后,我发现显然,默认情况下无法从委托中访问 CSS 数据,因为 CSS 解析和计算由应用程序没有直接的私有 QStyleSheetStyle 对象处理进入。该对象只是修改了各个option.palette 字段以供绘图例程使用。

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

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

    此方法将使用各自的设置绘制背景:

    认为应该有一种类似的方法来强制使用 CSS 修改的设置,如下所示:

    option.widget->style()->proxy()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter);
    

    但是,由于对 Qt 样式框架的内部运作缺乏了解,我还没有找到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多