我有一小段用于填充表格的代码。它打开磁盘上的文件,然后将数据放入表中。

if (file.open(QIODevice::ReadOnly))
    {
      QDataStream stream(&file);
      qint32 numRows, numColumns;
      stream >> numRows >> numColumns;
      QStandardItemModel* tempModel = new QStandardItemModel;
      tempModel->setRowCount(numRows);
      tempModel->setColumnCount(numColumns);

      for (int i = 0; i < numRows ; ++i) {
        for (int j = 0; j < numColumns; j++) {
          QStandardItem* tempItem = new QStandardItem; // stored in heap
          tempItem->read(stream);
          tempModel->setItem(i, j, tempItem);
        }
      }
      file.close();
      tableView->setModel(tempModel);
      ...
    }


此代码有效。但是我遇到的问题是,我打开的文件越多,使用的内存就越多,而且它永远不会崩溃。例如,如果添加第二个文件,则不再需要存储前一个文件的模型。我要删除它。

我猜测内存没有被释放,因为自从使用
new
关键字和指针以来,内存从未被删除。

如果我们以
tempItem
for
循环为例,我想我必须做类似的事情来解决它:

      for (int i = 0; i < numRows ; ++i) {
        for (int j = 0; j < numColumns; j++) {
          //QStandardItem* tempItem = new QStandardItem;
          QStandardItem tempItem; // store on stack and delete at end of scope
          //tempItem->read(stream);
          tempItem.read(stream);
          tempModel->setItem(i, j, tempItem);
        }


但是即使那样,它也会引发错误,因为
QStandardItemModel
setItem
(见到here)采用了
QStandardItem
指针。

如果可能,我想为
tempModel
tempItem
修复此问题。我在这里做错了什么?

最佳答案:

QStandardItemsetItem()QStandardItemQStandardItemModeltableView->setModel(tempModel);
QItemSelectionModel *m = tableView->selectionModel();
tableView->setModel(tempModel);
delete m;