【发布时间】:2012-12-24 16:20:50
【问题描述】:
我有一个QTreeView 并希望行的背景颜色不同,具体取决于它们的内容。为了实现这一点,我从QTreeView派生了一个class MyTreeView,并实现了paint方法如下:
void MyTreeView::drawRow (QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
QStyleOptionViewItem newOption(option);
if (someCondition)
{
newOption.palette.setColor( QPalette::Base, QColor(255, 0, 0) );
newOption.palette.setColor( QPalette::AlternateBase, QColor(200, 0, 0) );
}
else
{
newOption.palette.setColor( QPalette::Base, QColor(0, 0, 255) );
newOption.palette.setColor( QPalette::AlternateBase, QColor(0, 0, 200) );
}
QTreeView::drawRow(painter, newOption, index);
}
最初,我为 QTreeView 设置了setAlternatingRowColors(true);。
我的问题:为 QPalette::Base 设置颜色无效。每隔一行保持白色。
但是,设置 QPalette::AlternateBase 可以正常工作。
我试过setAutoFillBackground(true)和setAutoFillBackground(false)没有任何效果。
是否有任何提示如何解决这个问题?谢谢。
备注:通过将MyModel::data(const QModelIndex&, int role) 调整为Qt::BackgroundRole 来设置颜色并不能提供所需的结果。在这种情况下,背景颜色仅用于行的一部分。但我想为整行着色,包括左侧带有树导航的东西。
Qt 版本: 4.7.3
更新:
由于未知原因,QPalette::Base 似乎是不透明的。
setBrush 不会改变这一点。
我找到了以下解决方法:
if (someCondition)
{
painter->fillRect(option.rect, Qt::red);
newOption.palette.setBrush( QPalette::AlternateBase, Qt::green);
}
else
{
painter->fillRect(option.rect, Qt::orange);
newOption.palette.setBrush( QPalette::AlternateBase, Qt:blue);
}
【问题讨论】:
标签: c++ qt user-interface qtreeview