Python PySide SizeHint和PaintEvent返回不同的大小

Python PySide SizeHint和PaintEvent返回不同的大小,python,pyside,Python,Pyside,我正在创建一个定制的QStyledItemDelegate,但是我注意到当重写sizeHint和paint事件时,option.rect.size()返回的值是不同的。它似乎有18个像素不同。这是为什么?我如何将其安全地考虑到我的sizeHint事件中 大小提示大小:PySide2.QtCore.QSize(579379) 绘制事件大小:PySide2.QtCore.QSize(596379) 代码: sizeHint只是一个提示,您不能强制项目大小,因为视图负责实际“完成”它。初始的opt

我正在创建一个定制的QStyledItemDelegate,但是我注意到当重写sizeHint和paint事件时,option.rect.size()返回的值是不同的。它似乎有18个像素不同。这是为什么?我如何将其安全地考虑到我的sizeHint事件中

  • 大小提示大小:PySide2.QtCore.QSize(579379)
  • 绘制事件大小:PySide2.QtCore.QSize(596379)
代码:

sizeHint只是一个提示,您不能强制项目大小,因为视图负责实际“完成”它。初始的
opt.rect
由视图根据其特性创建(QListView基本上使用其宽度作为基础,然后根据图标、项目内容等计算“可能”大小)。然后,视图基于各种style()调用,最终确定实际的矩形。所以,问题是:你为什么需要它,为什么?(嗨,小丑!)
################################################################################
# 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()