我想将qstringlist的项添加到多列树视图中,但是当数据量很大或者数据到达率增加时,qtreeview没有响应并且需要很多内存
smodel =new QStandardItemModel(1,8,this);
smodel->setHeaderData(0,Qt::Horizontal,QObject::tr("Num"));
smodel->setHeaderData(1,Qt::Horizontal,QObject::tr("Time"));
smodel->setHeaderData(2,Qt::Horizontal,QObject::tr("Length"));
smodel->setHeaderData(3,Qt::Horizontal,QObject::tr("Source IP"));
smodel->setHeaderData(4,Qt::Horizontal,QObject::tr("Source Port"));
smodel->setHeaderData(5,Qt::Horizontal,QObject::tr("Protocol"));
smodel->setHeaderData(6,Qt::Horizontal,QObject::tr("Destination IP"));
smodel->setHeaderData(7,Qt::Horizontal,QObject::tr("Destination Port"));
ui->treeView->setModel(smodel);
void MainWindow::showPacket(QString pckt)
{
QStringList columns= pckt.split("\t");
if(columns.size()<8)
return;
QList<QStandardItem *> preparedRow =prepareRow(columns) ;
smodel->appendRow(preparedRow);
ui->treeView->scrollToBottom();
}
QList<QStandardItem *> MainWindow::prepareRow(QStringList pckt)
{
QList<QStandardItem *> rowItems;
rowItems << new QStandardItem(pckt[0]);
rowItems << new QStandardItem(pckt[1]);
rowItems << new QStandardItem(pckt[2]);
rowItems << new QStandardItem(pckt[3]);
rowItems << new QStandardItem(pckt[4]);
rowItems << new QStandardItem(pckt[5]);
rowItems << new QStandardItem(pckt[6]);
rowItems << new QStandardItem(pckt[7]);
return rowItems;
}
答案 0 :(得分:0)
为每个条目创建新的QStandardItem
会产生巨大的开销。我认为你应该继承QAbstractItemModel
并提供自己的实现。您的数据可以存储在一个QList<QStringList>
变量中。您不需要为每个条目创建对象。有关子类化的更多信息,请参阅QAbstractItemModel
文档。
答案 1 :(得分:0)
检查QTreeView memory consumption
相当古老,但似乎适用。
在制作自定义模型之前,尝试将数据调整为QTableView。如果使用表格解决了您的问题,您将会知道使用自定义模型QTreeView仍然无法顺利运行。
另外,来自QTreeView doc:
提高性能可以提供有关的视图提示 它正在处理的数据,以便在改善其性能时 显示大量项目。可采取的一种方法 用于显示具有相同高度的项目的视图是要设置的 uniformRowHeights 属性为true。