我有一个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设置:
(Darkblue行是选中的项目,lightblue-ish行是CSS悬停突出显示的行)
启用默认实现允许CSS设置影响我的委托,但它弄乱了图片:
问题是:
option.palette
似乎不包含此信息。我尝试按照here:
读取QTreeView属性qDebug() << treeView()->property("background");
但控制台显示QVariant(Invalid)
我还尝试阅读drawControl()
和drawPrimitive()
方法的Qt源代码,这些方法在默认委托实现中使用,但我设法只找到小部件调色板引用,并且没有与CSS覆盖的连接
答案 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);
此方法将使用相应的设置绘制背景:
我认为应该采用类似的方法强制使用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) {
...
}