我有QTreeView
渲染QAbstractItemModel
,我想根据模型中的数据设置某些单元格的背景。我从QBrush
返回model::data(Qt::BackgroundColorRole)
,直到我将一个样式应用于项目。
为项目设置任何样式(即使与背景颜色无关的内容,例如样式化边框)也会覆盖从模型返回的颜色(调用查询背景颜色的模型)。即视图的行为就像模型永远不会返回任何颜色一样。
我使用的是Qt 4.8,我无法升级到更高版本。
有没有办法让模型返回的颜色优先于样式? 为什么Qt会以这种奇怪的方式运行 - 模型具有更多的粒度并且知道的方式比样式可能知道的更多,为什么样式优先 - 毕竟,模型不必返回每个单独的颜色细胞 - 只有几个特定的?
我认为它是Qt中的一个错误,我打开了bug report,这个代码可以重现:
#include <QtCore/qabstractitemmodel.h>
#include <QtGui/qtreeview.h>
#include <QtGui/qtableview.h>
#include <QtGui/qapplication.h>
class MyModel : public QAbstractItemModel
{
public:
MyModel(QObject *parent) :QAbstractItemModel(parent){}
int rowCount(const QModelIndex &parent = QModelIndex()) const
{ return 2; }
int columnCount(const QModelIndex &parent = QModelIndex()) const
{ return parent.isValid() ? 0 : 2; }
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
if(index.row() >= 0 && index.column() >= 0)
{
switch(role)
{
case Qt::DisplayRole:
return QString("a");
case Qt::BackgroundRole:
return QBrush(QColor(255 * index.row(), 255 * index.column(), 0));
default:
break;
}
}
return QVariant();
}
virtual QModelIndex index(int pos, int column, const QModelIndex &parent = QModelIndex()) const
{ return createIndex(pos, column, 0); }
virtual QModelIndex parent(const QModelIndex &child) const
{ return QModelIndex(); }
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeView view;
MyModel myModel(0);
view.setModel(&myModel);
view.show();
//a.setStyleSheet("QTreeView::item { border: 1px solid black; }");
return a.exec();
}
如果您在返回前取消注释该行,则所有背景都将消失。
答案 0 :(得分:1)
我找到了一个解决方法 - 它仍然是一些额外的代码和恕我直言,它应该由Qt本身处理,但至少有一种方法用默认渲染覆盖背景,即我不需要重新实现默认委托(QStyledItemDelegate
)所做的一切:
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QVariant bg = index.data(Qt::BackgroundRole);
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(option.rect, bg.value<QBrush>());
QStyledItemDelegate::paint(painter, option, index);
}
如果模型返回的背景有些透明(我使用50的alpha值),它很好地覆盖了样式的背景,因此交替行着色或类似的东西仍然可见。 / p>
有趣的是,我也在标题中应用了相同的技巧(在重新实现的QHeaderView::paintSection
中)并且它没有工作 - 只要我不调用{{我的背景就可见了1}} - 如果我这样做,我的QHeaderView::paintSection
调用将被忽略。我将其作为一个单独的问题发布。