我可以使用以下代码设置表格行的大小:
table = QTableView()
table.setModel(CustomModel(dataFrame))
table.resizeRowsToContents()
当角色为 Qt.SizeHintRole 时,我的 CustomModel.data() 函数返回大小:
class CustomModel(QAbstractTableModel):
[...]
def data(self, index: QModelIndex, role=Qt.ItemDataRole):
if not index.isValid():
return None
path = self._dataframe.iloc[index.row(), index.column()]
pixmap = QPixmap(path)
if role == Qt.SizeHintRole:
return pixmap.size()
但是当我修改模型以便它可以获取更多项目时,如官方示例所示,不再考虑大小:
def setDataFrame(self, dataFrame: pd.DataFrame):
self._dataframe = dataFrame
self.beginResetModel()
self._rowCount = 0
self.endResetModel()
return
def canFetchMore(self, parent=QModelIndex()) -> bool:
return False if parent.isValid() else self._rowCount < len(self._dataframe)
def fetchMore(self, parent: QModelIndex | QPersistentModelIndex) -> None:
if parent.isValid(): return
remainder = len(self._dataframe) - self._rowCount
itemsToFetch = min(100, remainder)
if itemsToFetch <= 0: return
self.beginInsertRows(QModelIndex(), self._rowCount, self._rowCount + itemsToFetch - 1)
self._rowCount += itemsToFetch
self.endInsertRows()
def rowCount(self, parent=QModelIndex()) -> int:
return self._rowCount if parent == QModelIndex() else 0
当我更改
rowCount()
使其始终返回 len(self._dataframe)
时,大小会再次起作用(但“获取更多”功能会中断):
def rowCount(self, parent=QModelIndex()) -> int:
return len(self._dataframe) if parent == QModelIndex() else 0
知道为什么会发生这种情况吗?
正如 @musicamante 和 @relent95 所解释的,
resizeRowsToContents()
将来不会调整行的大小;所以每当插入新行时我都必须调用它。
添加
table.model().rowsInserted.connect(lambda: self.content.resizeRowsToContents())
解决了我的问题。