0

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

2 回答 2

0

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

于 2013-06-15T13:47:42.757 回答
0

检查QTreeView 内存消耗

很老了,但是,它似乎适用。

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

此外,来自 QTreeView 文档:

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

于 2013-06-16T13:56:38.093 回答