Python PySide SizeHint和PaintEvent返回不同的大小
我正在创建一个定制的QStyledItemDelegate,但是我注意到当重写sizeHint和paint事件时,option.rect.size()返回的值是不同的。它似乎有18个像素不同。这是为什么?我如何将其安全地考虑到我的sizeHint事件中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
- 大小提示大小:PySide2.QtCore.QSize(579379)
- 绘制事件大小:PySide2.QtCore.QSize(596379)
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()