更改QTreeView的行背景颜色不起作用
我有一个QTreeView
并根据其内容需要不同的行背景颜色。 为了达到这个目的,我从QTreeView
派生了一个class MyTreeView
, QTreeView
如下方式实现了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);
}
最初,我设置了setAlternatingRowColors(true);
为QTreeView。
我的问题:设置QPalette :: Base的颜色没有效果 。 每隔一行保持白色。
但是,设置QPalette :: AlternateBase按预期工作 。 我尝试setAutoFillBackground(true)
和setAutoFillBackground(false)
没有任何效果。
有什么提示如何解决这个问题? 谢谢。
备注:通过为Qt::BackgroundRole
调整MyModel::data(const QModelIndex&, int role)
来设置颜色并不能提供所需的结果。 在这种情况下,背景色仅用于行的一部分。 但是我想对整行进行着色,包括左侧的树状导航内容。
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);
}
如果唯一的问题是扩展/折叠控件没有像行的其余部分一样的背景,那么在你的模型中使用Qt::BackgroundRole
::data()
(如他们的答案中的pnezis所述),并将其添加到你的树视图类:
void MyTreeView::drawBranches(QPainter* painter,
const QRect& rect,
const QModelIndex& index) const
{
if (some condition depending on index)
painter->fillRect(rect, Qt::red);
else
painter->fillRect(rect, Qt::green);
QTreeView::drawBranches(painter, rect, index);
}
我已经使用Qt 4.8.0在Windows(Vista和7)上测试了这个,并且展开/折叠箭头具有适当的背景。 问题是这些箭头是视图的一部分,因此无法在模型中处理。
而不是QTreeView
你应该通过你的模型处理背景颜色。 使用data()
函数和Qt::BackgroundRole
来更改行的背景颜色。
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::BackgroundRole)
{
if (condition1)
return QColor(Qt::red);
else
return QColor(Qt::green);
}
// Handle other roles
return QVariant();
}
https://www.linux.org.ru/forum/development/4702439
if ( const QStyleOptionViewItemV4* opt = qstyleoption_cast<const QStyleOptionViewItemV4*>(&option) )
{
if (opt.features & QStyleOptionViewItemV4::Alternate)
painter->fillRect(option.rect,option.palette.alternateBase());
else
painter->fillRect(option.rect,painter->background());
}
链接地址: http://www.djcxy.com/p/87631.html
上一篇: Changing the row background color of a QTreeView does not work
下一篇: QTextEdit background color change also the color of scrollbar