Python QStyledItemDelegate油漆刷新问题

Python QStyledItemDelegate油漆刷新问题,python,pyqt,pyside,paint,qstyleditemdelegate,Python,Pyqt,Pyside,Paint,Qstyleditemdelegate,我目前正试图用“模型视图”的方法编写一个缩略图查看器应用程序 在本例中,我只是尝试绘制20个框,但我得到了一个看起来像随机选择的框,它会随着鼠标移动而更新。滚动会让事情变得更糟,有时绘图只有框等。而且文本似乎根本没有呈现 在我看来,这似乎是绘画方法的刷新/更新问题。 我是不是遗漏了什么 最终,我需要显示很多项目。它们都包含一些标签和一个需要在运行时更新的pixmap。所以我认为画它们是最快的解决方案。或者,我尝试使用以下方法在paint方法中呈现我的小部件: customWidget.rend

我目前正试图用“模型视图”的方法编写一个缩略图查看器应用程序

在本例中,我只是尝试绘制20个框,但我得到了一个看起来像随机选择的框,它会随着鼠标移动而更新。滚动会让事情变得更糟,有时绘图只有框等。而且文本似乎根本没有呈现

在我看来,这似乎是绘画方法的刷新/更新问题。 我是不是遗漏了什么

最终,我需要显示很多项目。它们都包含一些标签和一个需要在运行时更新的pixmap。所以我认为画它们是最快的解决方案。或者,我尝试使用以下方法在paint方法中呈现我的小部件:

customWidget.render(painter, QtCore.QPoint(0,0), renderFlags=QtGui.QWidget.DrawChildren)
这似乎比较慢,但至少起作用了

下面是一个简单的工作示例来说明我的问题:

import sys
from PySide import QtCore
from PySide import QtGui

elements = range(20)

class ElementListModel(QtCore.QAbstractListModel):
    def __init__(self, elements = [], parent = None):
        super(ElementListModel, self).__init__()
        self.__elements = elements

    def rowCount(self, parent):
        return len(self.__elements)

    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            return str(self.__elements[index.row()])

class ElementThumbDelegate(QtGui.QStyledItemDelegate):
    def __init__(self, view, parent=None):
        super(ElementThumbDelegate, self).__init__(parent)

    def paint(self, painter, options, index):

        width = options.rect.width()
        height = options.rect.height()

        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtGui.QColor(255, 255, 255))
        painter.setBrush(QtGui.QColor(10, 10, 10))
        painter.drawRect(0, 0, width, height)
        painter.drawText(options.rect, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter, str(index.data()))
        painter.translate(options.rect.topLeft())

    def sizeHint(self, options, index):
        return QtCore.QSize(50, 50)

def main():
    app = QtGui.QApplication(sys.argv)
    viewer = QtGui.QListView()

    viewModel = ElementListModel(elements)
    viewer.setModel(viewModel)
    viewer.setViewMode(QtGui.QListView.IconMode)
    viewer.setItemDelegate(ElementThumbDelegate(viewer))

    viewer.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

提前谢谢。任何帮助或指点下一步将不胜感激

事实证明,
painter.translate()
与在查看器原点(0,0)绘制长方体相结合,是在对抗自动定位并导致问题

代理到适当位置的转换由视图本身处理-无需手动执行

工作代码:

import sys
from PySide import QtCore
from PySide import QtGui

elements = range(20)

class ElementListModel(QtCore.QAbstractListModel):
    def __init__(self, elements = [], parent = None):
        super(ElementListModel, self).__init__()
        self.__elements = elements

    def rowCount(self, parent):
        return len(self.__elements)

    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            return str(self.__elements[index.row()])

class ElementThumbDelegate(QtGui.QStyledItemDelegate):
    def __init__(self, view, parent=None):
        super(ElementThumbDelegate, self).__init__(parent)

    def paint(self, painter, options, index):
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtGui.QColor(255, 255, 255))
        painter.setBrush(QtGui.QColor(10, 10, 10))
        painter.drawRect(options.rect)
        painter.drawText(options.rect, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter, str(index.data()))

    def sizeHint(self, options, index):
        return QtCore.QSize(50, 50)

def main():
    app = QtGui.QApplication(sys.argv)
    viewer = QtGui.QListView()

    viewModel = ElementListModel(elements)
    viewer.setModel(viewModel)
    viewer.setViewMode(QtGui.QListView.IconMode)
    viewer.setItemDelegate(ElementThumbDelegate(viewer))

    viewer.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

感谢这个示例-请注意,如果从PyQt5导入,则需要使用PyQt5的
导入QtWidgets
,以及:
QtWidgets.QStyledItemDelegate
QtWidgets.QListView
QtWidgets.QApplication