【发布时间】: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