qtreeview来自网络的大量数据

时间:2013-06-15 13:29:05

标签: qt qtreeview

我想将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;
} 

2 个答案:

答案 0 :(得分:0)

为每个条目创建新的QStandardItem会产生巨大的开销。我认为你应该继承QAbstractItemModel并提供自己的实现。您的数据可以存储在一个QList<QStringList>变量中。您不需要为每个条目创建对象。有关子类化的更多信息,请参阅QAbstractItemModel文档。

答案 1 :(得分:0)

检查QTreeView memory consumption

相当古老,但似乎适用。

在制作自定义模型之前,尝试将数据调整为QTableView。如果使用表格解决了您的问题,您将会知道使用自定义模型QTreeView仍然无法顺利运行。

另外,来自QTreeView doc:

  

提高性能可以提供有关的视图提示   它正在处理的数据,以便在改善其性能时   显示大量项目。可采取的一种方法   用于显示具有相同高度的项目的视图是要设置的    uniformRowHeights 属性为true。