用QTreeView显示网格线

时间:2014-07-08 15:42:59

标签: qt view model qtreeview gridlines

我正在使用带有自定义委托的QTreeView,并且我将QAbstractItemModel子类化。 我想看看没有孩子的物品的网格线。

在第一次显示时,一切看起来都很好,但只要鼠标悬停在某个项目上,底部或顶部线就会消失,并在悬停回项目时重新出现。

由于这是我的第一篇文章,似乎我无法发布一些图片来显示不良影响。

但我想我的自定义委托或QTreeView的样式表出了点问题:

void ProjetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if (index.column() > 0 && !index.model()->hasChildren(index))
    {        
        QPen pen;
        pen.setColor(QColor(Qt::lightGray));
        pen.setWidth(1);
        painter->setPen(pen);
        painter->drawRect(option.rect);
        QStyledItemDelegate::paint(painter,option,index);
    }
    else QStyledItemDelegate::paint(painter,option,index);
}

使用的样式表是:

QString treeViewStyle =
    "QTreeView { show-decoration-selected: 1; }"
    "QTreeView::item:hover { background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 lightgray, stop: 1 white); }"
    "QTreeView::item:selected:active { background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 lightgray, stop: 1 lightgray); color: black; }"
    "QTreeView::item:selected:!active { background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 lightgray, stop: 1 lightgray); color: black;}" ;

有没有人知道如何摆脱这种动态行为并在第一次显示时保持初始正确的视图?

感谢。

3 个答案:

答案 0 :(得分:0)

如果有问题,请尝试使用边框。很难说什么。

您可以使用红色和其他鲜艳颜色和标记项目(使用边框或bg)查看显示的颜色。它将帮助您找出哪个项目正在创建问题。

答案 1 :(得分:0)

我知道这篇文章很老了,但我认为我还可以做出贡献:

问题是你使用

QStyledItemDelegate::paint(painter,option,index);
<!>之后(!)你绘制了你的矩形,所以这可以(我猜实际上是IS)重绘你的矩形。 我在QTreeView中遇到了同样的问题,我想画一个网格

希望这有帮助

答案 2 :(得分:0)

使用项目委托可能会很好,但是在显示大量项目时可能会导致性能低下,因为每个项目必须循环使用其paint方法。 此外,如果为每个列使用不同的委托(有些人有自己的绘制方法),这可能是一个问题。

另一种方法可能是实现QTreeView.drawRow(),其优点是不绘制可能导致与非黑色(或alpha组件)颜色不一致的绘图的实际矩形。 我正在使用PyQt,但这应该对其他语言仍然可读。

def drawRow(self, painter, option, index):
    QtGui.QTreeView.drawRow(self, painter, option, index)
    painter.setPen(QtCore.Qt.lightGray)
    y = option.rect.y()
    #saving is mandatory to keep alignment through out the row painting
    painter.save()
    painter.translate(self.visualRect(self.model().index(0, 0)).x() - self.indentation() - .5, -.5)
    for sectionId in range(self.header().count() - 1):
        painter.translate(self.header().sectionSize(sectionId), 0)
        painter.drawLine(0, y, 0, y + option.rect.height())
    painter.restore()
    #don't draw the line before the root index
    if index == self.model().index(0, 0):
        return
    painter.drawLine(0, y, option.rect.width(), y)

上面的代码在每行之前绘制一条水平线,在每列之前绘制一条垂直线,跟踪标题部分的大小和树缩进;请记住,我没有检查它与rootIsDecorated属性的行为方式。