我正在尝试使用一个表视图,该表视图接收数据流并将行添加到基础模型。在一天的过程中,我收到了成千上万的行,因此我只希望限制显示,以便仅存储和显示最新的行。我尝试使用removeRows和takeRow,但是在两种情况下,该进程使用的内存似乎都会随着时间而膨胀。我写了一个简短的示例,演示了我所看到的记忆效果。
在此示例中,我使用模型创建表视图,并使用计时器重复添加和删除行。尽管我编写的代码的原始版本使用removeRows删除旧行,但在这里我将其替换为takeRow以重用QStandardItems。我目前的猜测是,即使QStandardItemModel的内存消耗并没有随着时间的增长,每个附加的行/项目也会在QTableView中获得一些内存分配。
这是示例代码:
TestView.h:
#ifndef TESTVIEW_H
#define TESTVIEW_H
#include <queue>
#include <QApplication>
#include <QCoreApplication>
#include <QList>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>
#include <QTableView>
#include <QTimer>
class TestView : public QTableView {
Q_OBJECT
public:
TestView() : QTableView(), model_(0, 1), timer_(this), row_id_(0) {
setModel(&model_);
connect(&timer_, SIGNAL(timeout()), this, SLOT(AddRow()));
timer_.start(1);
}
virtual ~TestView() {}
public slots:
void AddRow() {
for (int k = 0; k < 1000; ++k) {
QList<QStandardItem*> new_row;
QString val;
val.setNum(row_id_);
if (items_.empty()) {
new_row.append(new QStandardItem(val));
} else {
QStandardItem* item = items_.front();
item->setText(val);
items_.pop();
new_row.append(item);
}
model_.invisibleRootItem()->appendRow(new_row);
++row_id_;
}
while (model_.rowCount() > 1000) {
auto row = model_.takeRow(0);
items_.push(row[0]);
}
}
private:
QStandardItemModel model_;
QTimer timer_;
int row_id_;
std::queue<QStandardItem*> items_;
};
#endif // TESTVIEW_H
main.cpp:
#include <QApplication>
#include "TestView.h"
int main(int argc, char** argv) {
QApplication app(argc, argv);
TestView view;
view.show();
return app.exec();
}