QListView 可以有不同的垂直和水平间距吗?
Can a QListView have different vertical and horizontal spacing?
我正在尝试使设置为 IconMode 的 QListView 在水平和垂直方向上具有不同的间距。可以使用这个 class 来实现吗?
此外,我所有的图标都具有相同的宽度,但它们的高度会发生变化,我希望视图能够适应这些不同的尺寸。
两者都可以由 QStyledItemDelegate()
完成。在我的示例(pyqt5)中 model.data()
returns 图标的路径,所有图标的宽度均为 100。sizeHint()
的 return 值取决于高度项目图标和垂直和水平间距:
class MyDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self):
QtWidgets.QItemDelegate.__init__(self)
self.pen= QtGui.QPen(QtGui.QColor(0,0,0))
self.imageWidth = 100
self.horizontalSpacing = 5
self.verticalSpacing = 10
def sizeHint(self, option, index):
width = self.imageWidth + 2*self.horizontalSpacing
height = QtGui.QImage(index.data()).height() + 2*self.verticalSpacing
return QtCore.QSize(width, height)
def paint(self, painter, option, index):
border = option.rect # item.rect in the view
image = QtGui.QImage(index.data()) # model.data() returns the path of the imagefile
painter.save()
painter.setPen(self.pen)
painter.drawRect(border)
painter.drawImage(QtCore.QPointF(border.x() + self.horizontalSpacing, border.top() + self.verticalSpacing), image)
painter.restore()
通过setItemDelegate()
将委托设置为视图
看起来像这样:
我正在尝试使设置为 IconMode 的 QListView 在水平和垂直方向上具有不同的间距。可以使用这个 class 来实现吗?
此外,我所有的图标都具有相同的宽度,但它们的高度会发生变化,我希望视图能够适应这些不同的尺寸。
两者都可以由 QStyledItemDelegate()
完成。在我的示例(pyqt5)中 model.data()
returns 图标的路径,所有图标的宽度均为 100。sizeHint()
的 return 值取决于高度项目图标和垂直和水平间距:
class MyDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self):
QtWidgets.QItemDelegate.__init__(self)
self.pen= QtGui.QPen(QtGui.QColor(0,0,0))
self.imageWidth = 100
self.horizontalSpacing = 5
self.verticalSpacing = 10
def sizeHint(self, option, index):
width = self.imageWidth + 2*self.horizontalSpacing
height = QtGui.QImage(index.data()).height() + 2*self.verticalSpacing
return QtCore.QSize(width, height)
def paint(self, painter, option, index):
border = option.rect # item.rect in the view
image = QtGui.QImage(index.data()) # model.data() returns the path of the imagefile
painter.save()
painter.setPen(self.pen)
painter.drawRect(border)
painter.drawImage(QtCore.QPointF(border.x() + self.horizontalSpacing, border.top() + self.verticalSpacing), image)
painter.restore()
通过setItemDelegate()
看起来像这样: