python - PySide SizeHint 和 PaintEvent 返回不同的大小
问题描述
我正在创建一个自定义 QStyledItemDelegate 但是我注意到在覆盖 sizeHint 和绘制事件时, option.rect.size() 的返回值是不同的。它似乎有 18 个像素的不同。为什么会这样?如何安全地将其纳入我的 sizeHint 事件?
- 尺寸提示尺寸:PySide2.QtCore.QSize(579, 379)
- 绘制事件大小:PySide2.QtCore.QSize(596, 379)
代码:
################################################################################
# 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()
解决方案
推荐阅读
- scikit-learn - 网格搜索 CV 中的错误 - RidgeClassifierCV 作为构造函数未设置或修改参数 alphas
- docker - 没有 VTX 或 AMD-V 的 Docker
- z3py - 我们可以从字符串评估 z3py 表达式吗?
- html - Fullpage.js Jquery 代码没有使 HTML 页面按预期工作
- git - git lfs migrate import 后文件已变为 unreadbale,如何撤消
- php - 如何在 laravel 中更新哈希密码?
- javascript - 有角度的javascript时间选择器
- javascript - Vuejs:如何为每个下拉项目实现弹出框
- javascript - 如何使用 OneDrive File Picker JavaScript SDK v7.2?身份验证失败
- c++ - 在数组中搜索元素,如果不存在则将其附加到数组的末尾