如何永久设置 QListView 行高
How to set QListView rows height permanently
不幸的是,QTableView.resizeRowsToContents()
仅设置当前填充 TableView
的那些行(或项目)的高度。使用第一个 model
的 reset() 或更新 QTableView
的行的高度切换回某个默认值(似乎约为 32 像素高)。
大多数情况下,此默认行高不必要地高,留下许多有价值的屏幕 space 未填充。
如何永久应用对行高的更改?
我发现了两种永久设置行高的方法,您要么必须在模型中使用 SizeHintRole,要么在 QStyledItemDelegate 中实现 sizeHint 方法。代码如下所示:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class ListModel(QAbstractListModel):
def __init__(self, data=[], parent=None):
QAbstractListModel.__init__(self, parent)
self.data = data
def rowCount(self, parent=None):
return len(self.data)
def data(self, index, role=None):
if role == Qt.DisplayRole:
row = index.row()
value = self.data[row]
return value
# ==============Comment if you're using delegate===============
if role == Qt.SizeHintRole:
return QSize(100, 75)
# =============================================================
class ListDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
QStyledItemDelegate.__init__(self, parent)
def sizeHint(self, option, index):
return QSize(100, 20)
app = QApplication(sys.argv)
listview = QListView()
model = ListModel([12, 15, 19])
listview.setModel(model)
# =============uncomment to use delegate=====================
# delegate = ListDelegate()
# listview.setItemDelegate(delegate)
# ============================================================
listview.show()
sys.exit(app.exec_())
不幸的是,QTableView.resizeRowsToContents()
仅设置当前填充 TableView
的那些行(或项目)的高度。使用第一个 model
的 reset() 或更新 QTableView
的行的高度切换回某个默认值(似乎约为 32 像素高)。
大多数情况下,此默认行高不必要地高,留下许多有价值的屏幕 space 未填充。
如何永久应用对行高的更改?
我发现了两种永久设置行高的方法,您要么必须在模型中使用 SizeHintRole,要么在 QStyledItemDelegate 中实现 sizeHint 方法。代码如下所示:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class ListModel(QAbstractListModel):
def __init__(self, data=[], parent=None):
QAbstractListModel.__init__(self, parent)
self.data = data
def rowCount(self, parent=None):
return len(self.data)
def data(self, index, role=None):
if role == Qt.DisplayRole:
row = index.row()
value = self.data[row]
return value
# ==============Comment if you're using delegate===============
if role == Qt.SizeHintRole:
return QSize(100, 75)
# =============================================================
class ListDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
QStyledItemDelegate.__init__(self, parent)
def sizeHint(self, option, index):
return QSize(100, 20)
app = QApplication(sys.argv)
listview = QListView()
model = ListModel([12, 15, 19])
listview.setModel(model)
# =============uncomment to use delegate=====================
# delegate = ListDelegate()
# listview.setItemDelegate(delegate)
# ============================================================
listview.show()
sys.exit(app.exec_())