首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QListWidget中的项目数量有任何限制吗?

QListWidget中的项目数量有任何限制吗?
EN

Stack Overflow用户
提问于 2022-08-16 08:57:31
回答 1查看 130关注 0票数 0

我正在用PyQt5编写一个程序。

可以添加到QListWidget中的项的数量有任何限制吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-16 19:53:32

如果视图是按需填充的(同时显示的项目相对较少),则没有有效限制(如Qt文档中的获取更多示例所示)。但是,可以同时显示的项目数确实有一个固定的限制。

这个限制是由一个signed int的大小决定的(这个大小又由编译Qt库的编译器决定)。对于大多数系统来说,大小将是4个字节(但对于某些嵌入式系统可能是2个字节),这相当于2,147,383,647项。

大小不能大于此,因为所有模型(包括QListWidget使用的内部模型)都必须是QAbstractItemModel的子类,这些子类是从方法(如rowCount )返回整数值所必需的。如果返回更大的值,则会发生溢出错误:

代码语言:javascript
运行
复制
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()

输出:

代码语言:javascript
运行
复制
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也是如此)。在达到固定限制之前很久,性能方面的考虑将要求需要某种取得更多方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73371348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档