qtreeview,具有来自网络的大数据

qtreeview,具有来自网络的大数据,qt,qtreeview,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->setHea

我想将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;
} 
smodel=新的QStandardItemModel(1,8,本);
smodel->setHeaderData(0,Qt::Horizontal,QObject::tr(“Num”);
smodel->setHeaderData(1,Qt::水平,QObject::tr(“时间”);
smodel->setHeaderData(2,Qt::水平,QObject::tr(“长度”);
smodel->setHeaderData(3,Qt::Horizontal,QObject::tr(“源IP”));
smodel->setHeaderData(4,Qt::Horizontal,QObject::tr(“源端口”);
smodel->setHeaderData(5,Qt::Horizontal,QObject::tr(“协议”);
smodel->setHeaderData(6,Qt::Horizontal,QObject::tr(“目标IP”));
smodel->setHeaderData(7,Qt::Horizontal,QObject::tr(“目标端口”));
ui->treeView->setModel(smodel);
void主窗口::showPacket(QString pckt)
{
QStringList columns=pckt.split(“\t”);
if(columns.size()appendRow(preparedRow);
ui->treeView->scrollToBottom();
}
QList主窗口::prepareRow(QStringList pckt)
{
QList行项目;

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

检查

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

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

此外,从QTreeView文档:

提高性能可以给出有关 它正在处理的数据,以便在 显示大量项目。一种可用于 要设置用于显示高度相等的项目的视图 uniformRowHeights属性设置为true


很好的提示,我还将分析整个应用程序,以防接收和处理数据是导致UI阻塞的瓶颈。我真的很想按照你说的做,但我真的不知道如何做,我需要示例来说明如何使用你的解决方案将qstringlist转换为qtreeview中的一行。我真的很想按照你说的做,但我真的我不知道怎么做,我需要一个例子来告诉我怎么做,但是qstringlist在qtreeview中变成一行,我希望你能给我一个例子,告诉我怎么做,以及在AbstractItemModel中,如果(role==Qt::DisplayRole&&index.isValid())plzi的数据()有什么问题{QStringList*pkt=static_cast(index.internalPointer());if(index.column()==0)返回pkt->at(0);正如我所说的,在创建自定义模型之前,在普通的QStandardItemModel上重新排列数据,并使用QTableView(这要快得多)如果它突然运行平稳,您就会知道这是QTreeView的问题,而不是数据的问题