首页 > 解决方案 > PySide SizeHint 和 PaintEvent 返回不同的大小

问题描述

我正在创建一个自定义 QStyledItemDelegate 但是我注意到在覆盖 sizeHint 和绘制事件时, option.rect.size() 的返回值是不同的。它似乎有 18 个像素的不同。为什么会这样?如何安全地将其纳入我的 sizeHint 事件?

代码:

################################################################################
# imports
################################################################################
import os
import sys
from PySide2 import QtGui, QtWidgets, QtCore


################################################################################
# QStyledItemDelegate
################################################################################
class CardDelegate(QtWidgets.QStyledItemDelegate):

    def __init__(self, parent=None, *args):
        QtWidgets.QStyledItemDelegate.__init__(self, parent, *args)


    # overrides
    def sizeHint(self, option, index):
        print('SIZE HINT SIZE:', option.rect.size())
        return option.rect.size()
        return super(CardDelegate, self).sizeHint(option, index)


    def paint(self, painter, option, index):
        print('PAINT EVENT SIZE:', option.rect.size())
        super(CardDelegate, self).paint(painter, option, index)


################################################################################
# Widgets
################################################################################
class ListViewExample(QtWidgets.QWidget):
    '''
    Description:
        Extension of listview which supports searching
    '''
    def __init__(self, parent=None):
        super(ListViewExample, self).__init__(parent)

        self.itemModel = QtGui.QStandardItemModel()

        self.listView = QtWidgets.QListView()
        self.listView.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
        self.listView.verticalScrollBar().setSingleStep(10)
        self.listView.setIconSize(QtCore.QSize(128,64))
        self.listView.setModel(self.itemModel)
        self.listView.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
        self.listView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.listView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.listView.setMinimumHeight(250)
        self.listView.setItemDelegate(CardDelegate())

        # layout
        self.mainLayout = QtWidgets.QVBoxLayout()
        self.mainLayout.setContentsMargins(0,0,0,0)
        self.mainLayout.setSpacing(0)
        self.mainLayout.addWidget(self.listView)
        self.setLayout(self.mainLayout)


    # def resizeEvent(self, event):
    #     # IMPORTANT FOR MULTILINE SUPPORT
    #     # self.itemModel.layoutChanged.emit()
    #     self.listView.scheduleDelayedItemsLayout()


################################################################################
# Widgets
################################################################################
def main():
    app = QtWidgets.QApplication(sys.argv)
    window = ListViewExample()
    window.resize(600,400)
    window.itemModel.clear()
    for i in range(1):
        item = QtGui.QStandardItem('Test')
        window.itemModel.appendRow(item)
    window.show()
    app.exec_()


if __name__ == '__main__':
    pass
    main()

标签: pythonpyside

解决方案


推荐阅读