QTableWidget 可以有多少行或列?

How many rows or columns can QTableWidget have?

我想制作一个类似 Excel 的电子表格。 Excel 2010 年有 1048576 行和 A - ZZZ 列。但在 Qt 中,如果超过 7000~8000 行,应用程序就会崩溃。

是bug,还是Qt的默认设置?当然,这种崩溃发生在较低版本。你运行遇到同样的问题吗?

示例代码:

from PySide2 import QtWidgets
import PySide2
import os

dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
import sys
import itertools
alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
alphabet2 =[i[0]+i[1] for i in itertools.product(alphabet, alphabet)]
alphabet3 =[i[0]+i[1] for i in itertools.product(alphabet, alphabet2)]
alphabet = alphabet + alphabet2 + alphabet3
EXCEL2010_ROW_MAX = 1048576
NOW_POSSIBLE_MAX = 7000
def main():
    app = QtWidgets.QApplication([])
    tablewidget = QtWidgets.QTableWidget()
    tablewidget.setRowCount(EXCEL2010_ROW_MAX)
    tablewidget.setColumnCount(len(alphabet))
    tablewidget.setHorizontalHeaderLabels(alphabet)    
    tablewidget.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()

这不是错误 - 您的计算机只是 运行 内存不足。

您的示例代码创建了一个包含超过 190 亿个单元格 ((26¹ + 26² + 26³) * 1048576 = 19165872128) 的 table。因此,除非您的计算机有几十 GB 的可用内存,否则无法加载它。似乎可以安全地假设 Excel 也不会尝试呈现该大小的 实际 table。即使它支持 1048576 行乘 16384 列的 virtual 最大大小,也不意味着您可以用数据填充每个单元格。您将始终受到系统可用内存量(和磁盘 space)的限制。

当您使用像 QTableWidgetQStandardItemModel 这样的基于项目的便利 类 时,您无法避免这些限制,因为需要预先分配太多内存。因此,如果您想在 Qt 中模拟 Excel,则需要将 QTableView 与自定义模型一起使用。这允许您创建任意大小的 virtual tables,因为 Qt 只会尝试渲染当前在视口中可见的单元格。

这是一个简单的演示:

import sys
from PySide2 import QtCore, QtWidgets

class CustomModel(QtCore.QAbstractItemModel):
    def rowCount(self, *args):
        return 1048576

    def columnCount(self, *args):
        return 163846

    def index(self, *args):
        return QtCore.QModelIndex()

app = QtWidgets.QApplication(sys.argv)
table = QtWidgets.QTableView()
model = CustomModel()
table.setModel(model)
table.show()
sys.exit(app.exec_())

有关如何实施自定义模型的更多详细信息,请参阅 Model Subclassing Reference