qtreeview,具有来自网络的大数据
我想将qstringlist的项添加到多列树视图中,但当数据太大或数据到达率增加时,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
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的问题,而不是数据的问题