我尝试使用Qt void QStandardItem::insertRow(int row, const QList<QStandardItem *> &items)
和void QStandardItem::appendRow(const QList<QStandardItem *> &items)
在我的模型中动态添加行。对于少量行,这些花费的时间非常少。但是,对于大量的行条目,比如100,000,它需要很长时间。
I read this similar question 但它不是很有用。有没有其他方法可以更有效地完成这项工作?
答案 0 :(得分:1)
感谢评论部分指出我正确的方向,我能够自己解决问题。
我尝试实现QAbstractItemModel
的子类。以下是bool QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
的推论。此代码只在我的GUI中添加了空白单元格。这个想法只是为了检查细胞的加入速度:
bool CustomTableModel::insertRows(int position, int rows, const QModelIndex &parent)
{
beginInsertRows(parent, position, position + rows - 1);
for (int row = 0; row < rows; row++)
{
QStringList items;
for (int column = 0; column < 7; ++column)// I required only 7 columns
items.append("");
rowList.insert(position, items); // QList<QStringList> rowList;
}
endInsertRows();
return true;
}
此方法提高了添加新行的整体性能。但是,我的要求仍然不是很快。似乎QAbstractItemModel::beginInsertRows(const QModelIndex & parent, int first, int last)
和QAbstractItemModel::endInsertRows()
导致了整体瓶颈。
最后,我只使用以下构造函数来创建一个包含足够多行的表:
CustomTableModel::CustomTableModel(int rows, int columns, QObject *parent): QAbstractTableModel(parent)
{
QStringList newList;
for (int column = 0; column < columns; column++) {
newList.append("");
}
for (int row = 0; row < rows; row++) {
rowList.append(newList); // QList<QStringList> rowList;
}
}
然后我创建了一个自定义函数来在单元格中插入值:
void CustomTableModel::insertRowValues(int row,int col, QString val)
{
rowList[row][col] = val;
}
重复调用此函数以填充单个单元格,创建表格的速度非常快(或至少比之前更快)。这个解决方案感觉不是很优雅,但它解决了我的问题。