QTableView中的动画进度条 - 如何?

时间:2014-05-30 10:53:43

标签: qt pyqt pyside qtableview

我有一个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

0 个答案:

没有答案