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)的限制。
当您使用像 QTableWidget
或 QStandardItemModel
这样的基于项目的便利 类 时,您无法避免这些限制,因为需要预先分配太多内存。因此,如果您想在 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。
我想制作一个类似 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)的限制。
当您使用像 QTableWidget
或 QStandardItemModel
这样的基于项目的便利 类 时,您无法避免这些限制,因为需要预先分配太多内存。因此,如果您想在 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。