我的 python/Qt 应用程序的中心是使用 QTableView 的表格视图。在一栏中,我通过子类化
QStyledItemDelegate
来实现迷你图,并将相应列中的数据项设置为 numpy 数组,并在委托的 Paint 方法中绘制它们。
我的线图稍微超出了边界框,但我喜欢这种效果(并且我想保留它):
但是,当我向下刷时,会发生一些重新绘制,并且不知怎的,会发生一些背景重新绘制,从而产生一个临时图像,其中中性背景打破了重绘的线条:
当我离开窗口或触摸标题时,会再次发生一些重新绘制,回到第一张图像。
背景重绘是如何以及在哪里发生的,我能做些什么来影响它?我很惊讶,因为我的用户代码覆盖了委托绘制方法并且只绘制线条。
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 )
。这些都没有执行任何操作,因为我的绘画代码从未调用任何背景绘画。
根据@musicamante的第一个建议,我尝试重新绘制所有内容。 在绘画代码的开头,我请求悬停时完全重绘:
if option.state & QtWidgets.QStyle.State_MouseOver:
ind = QtCore.QModelIndex()
self.model.dataChanged.emit(ind, ind)
这似乎抑制了鼠标悬停时的闪烁。绘图仍处于重绘状态。这与我想要的足够接近。