我有一个QTableView,我想在其中绘制一个带有进度条的列 我考虑了Qt Torrent示例应用程序并重新实现了QStyledItemDelegate的paint()函数,如下所示:
def paint(self, painter, option, index):
if index.column() == 1:
progressBar = QtGui.QStyleOptionProgressBarV2()
progressBar.state = QtGui.QStyle.State_Enabled
progressBar.direction = QtGui.QApplication.layoutDirection()
progressBar.rect = option.rect
progressBar.fontMetrics = QtGui.QApplication.fontMetrics()
progressBar.minimum = 0
progressBar.maximum = 100
progressBar.textAlignment = QtCore.Qt.AlignCenter
progressBar.textVisible = True
progressBar.progress = 20 # for testing
QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_ProgressBar, progressBar, painter)
return super(progressBarDelegate, self).paint(painter, option, index)
然而,这给了我一列灰色的进度条 - 没有动画。 Screenshot here.
这不是文档描述的示例中的屏幕截图。
然后我发现了QTableView的setIndexWidget() 每当在模型上调用data()但没有显示进度条时,我试图实现setIndexWidget() 所以我想我会在委托paint()代码中尝试setIndexWidget() 我创建了一个字典(self.parent.progressBarPool)来跟踪制作了哪些进度条 - 以避免过多的创建/删除。
def paint(self, painter, option, index):
if index.column() == 1:
if not index.row() in self.parent.progressBarPool:
progressBar = QtGui.QProgressBar()
self.parent.progressBarPool[index.row()] = progressBar
progressBar.setMinimum(0)
# progressBar.setAutoFillBackground(True) # docs say this needs to be true, but you get a better row-highlight appearance with it False
self.parent.tableView.setIndexWidget(index, progressBar)
else:
progressBar = self.parent.progressBarPool[index.row()]
progressBar.setValue(20) # for testing
return super(progressBarDelegate, self).paint(painter, option, index)
这看起来很棒(screenshot here)但是,当我滚动时,进度条不会与滚动区域的其余部分一致移动。
它们漂浮在它们下面滚动的细胞上方(screenshot)
我现在已经破解了一些东西,以便在有一个wheelEvent时删除self.parent.progressBarPool。
这会导致(一种类型)滚动上的浮动重绘,但感觉就像一堆不断增加的黑客而不是解决方案。
因此,对于正确的方法,我将不胜感激。
谢谢,
戴夫。
pyqt 4.10.1
qt 4.8.4
Mac OS 10.6.8