Qt4.8 QTableView / QStandardItemModel removeRow / takeRow内存管理

时间:2018-12-14 15:40:18

标签: c++ qt

我正在尝试使用一个表视图,该表视图接收数据流并将行添加到基础模型。在一天的过程中,我收到了成千上万的行,因此我只希望限制显示,以便仅存储和显示最新的行。我尝试使用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();
}

0 个答案:

没有答案