说重点,我使用的方法是重写model的data函数和QTreeView的drawBranches。data函数可以控制item行背景色,但是,并不能控制树的下拉控制部分的背景色,这个由drawBranches来配合。
上代码:
QVariant MyModel::data(const QModelIndex &index, int role /*= Qt::DisplayRole*/) const
{
if (!index.isValid())
return QStandardItemModel::data(index, role);
//可以在item里记录一些信息,这里用来作为控制条件
QStandardItem* pItem = itemFromIndex(index);
if (pItem && role == Qt::BackgroundRole)
{
if (pItem->data(Qt::UserRole).toBool())
return QColor(Qt::red);
}
// Handle other roles
return QStandardItemModel::data(index, role);
}
void MyTreeView::drawBranches(QPainter * painter, const QRect& rect,const QModelIndex& index)const
{
QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(this->model());
QStandardItem* pItem = pModel->itemFromIndex(index);
//可以在item里记录一些信息,这里用来作为控制条件
if (pItem && pItem->data(Qt::UserRole).toBool())
{
painter->fillRect(rect, QColor(Qt::red));
}
QTreeView::drawBranches(painter,rect,index);
}
主要就是上边的代码,如果效果还是没绘制出来,检查下QTreeView的样式,有没有在qss里设置了QTreeView::item:alternate ,QTreeView::branch:alternate的背景色,如果设置了可能会不生效。
再不行就终极大法,delegate里重绘。不过我试了重绘,掌握不好绘制的rect区域,和绘制次序,所以放弃了~~如果你用的delegate重绘,麻烦一起交流下!