【问题标题】:QStyledItemDelegate paint refresh issuesQStyledItemDelegate 绘制刷新问题
【发布时间】:2016-10-08 13:40:00
【问题描述】:

我目前正在尝试围绕模型视图方法编写一个缩略图查看器应用程序。

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

对我来说,这看起来像是绘制方法的刷新/更新问题。 我在这里遗漏了什么吗?

最终我需要展示很多项目。所有这些都包含一些标签和一个需要在运行时更新的像素图。所以我认为画它们是最快的解决方案。或者,我尝试在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()

提前致谢。任何帮助或下一步寻找的指针将不胜感激!

【问题讨论】:

    标签: python pyqt pyside paint qstyleditemdelegate


    【解决方案1】:

    事实证明,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 导入,则需要使用from PyQt5 import QtWidgets,以及:QtWidgets.QStyledItemDelegateQtWidgets.QListViewQtWidgets.QApplication
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多