我正在用PyQt5编写一个程序。
可以添加到QListWidget中的项的数量有任何限制吗?
发布于 2022-08-16 19:53:32
如果视图是按需填充的(同时显示的项目相对较少),则没有有效限制(如Qt文档中的获取更多示例所示)。但是,可以同时显示的项目数确实有一个固定的限制。
这个限制是由一个signed int
的大小决定的(这个大小又由编译Qt库的编译器决定)。对于大多数系统来说,大小将是4个字节(但对于某些嵌入式系统可能是2个字节),这相当于2,147,383,647项。
大小不能大于此,因为所有模型(包括QListWidget使用的内部模型)都必须是QAbstractItemModel的子类,这些子类是从方法(如rowCount )返回整数值所必需的。如果返回更大的值,则会发生溢出错误:
import ctypes
from PyQt5 import QtCore, QtWidgets
MAXINT = 2 ** (8 * ctypes.sizeof(ctypes.c_int())) // 2 - 1
class Model(QtCore.QAbstractListModel):
def data(self, index, role=QtCore.Qt.DisplayRole):
if index.isValid() and role == QtCore.Qt.DisplayRole:
return f'Item ({index.row()})'
def rowCount(self, parent=None):
return MAXINT + 1
app = QtWidgets.QApplication(['Test'])
view = QtWidgets.QListView()
model = Model()
print('row-count:', model.rowCount())
view.setModel(model)
view.show()
app.exec()
输出:
row-count: 2147483648
OverflowError: invalid result from Model.rowCount(), value must be in the range -2147483648 to 2147483647
但是,即使您将项目数量限制在低于此固定限制的范围内,也无法保证视图能够显示它们。在测试中,我发现一万件物品几乎立刻就会装载,10万件大约需要1-2秒,100万件大约20秒。但是,一次显示1,000万个项目需要3分钟以上的时间,而试图加载5亿多个项目则会导致立即出现分段错误。
对于QListWidget来说,这些时间安排要糟糕得多,因为创建QListWidgetItem的成本增加了大量的开销(QStandardItemModel也是如此)。在达到固定限制之前很久,性能方面的考虑将要求需要某种取得更多方法。
https://stackoverflow.com/questions/73371348
复制相似问题