如何优化 QTreeView 中委托行的繁琐重叠绘制?

问题描述 投票:0回答:1

我的 python/Qt 应用程序的中心是使用 QTableView 的表格视图。在一栏中,我通过子类化

QStyledItemDelegate
来实现迷你图,并将相应列中的数据项设置为 numpy 数组,并在委托的 Paint 方法中绘制它们。

我的线图稍微超出了边界框,但我喜欢这种效果(并且我想保留它):

sparkline rows, showing overlapping lines

但是,当我向下刷时,会发生一些重新绘制,并且不知怎的,会发生一些背景重新绘制,从而产生一个临时图像,其中中性背景打破了重绘的线条:

sparkline rows, showing broken lines

当我离开窗口或触摸标题时,会再次发生一些重新绘制,回到第一张图像。

问题

背景重绘是如何以及在哪里发生的,我能做些什么来影响它?我很惊讶,因为我的用户代码覆盖了委托绘制方法并且只绘制线条。

我的绘画方法

def paint(self, painter, option, index):
    
    data = index.data(UserRole+1)
    rectF = option.rect.toRectF()
    ndims = self.ndims
    yscale = self.yscale

    midHeight = rectF.top() + rectF.height()/2
    ctrLine = QtCore.QLineF( rectF.left(), midHeight,
        rectF.right(), midHeight )
    painter.setPen( self.midPen )
    painter.drawLine( ctrLine )

    painter.setPen( self.linePen )

    segWidth = rectF.width() / (ndims-1)
    for s in range(ndims-1):
        seg = data[s:s+2]
        segProj = -seg / yscale * rectF.height()
        segLine = QtCore.QLineF( rectF.left() + s*segWidth,
            midHeight + segProj[0],
            rectF.left() + (s+1)*segWidth,
            midHeight + segProj[1]  )
        painter.drawLine( segLine )

我尝试使用不透明或透明的 QColor 设置

item.setBackground( brush )
。这些都没有执行任何操作,因为我的绘画代码从未调用任何背景绘画。

python qt pyside6 sparklines
1个回答
0
投票

根据@musicamante的第一个建议,我尝试重新绘制所有内容。 在绘画代码的开头,我请求悬停时完全重绘:

if option.state & QtWidgets.QStyle.State_MouseOver:
    ind = QtCore.QModelIndex()
    self.model.dataChanged.emit(ind, ind)

这似乎抑制了鼠标悬停时的闪烁。绘图仍处于重绘状态。这与我想要的足够接近。

© www.soinside.com 2019 - 2024. All rights reserved.