ssff5678 |
2019-11-04 11:13 |
tableView显示实时数据,会不会内存泄漏?
利用Qt modbus做了一个每秒读取串口数据的tableView,在为QStandardItemModel赋值时,每次都要new QStandardItem值,然后再setItem,没有delete操作,长时间运行是否发生内存泄漏呢?请大神赐教,谢谢! 构造:
- MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) , ui(new Ui::MainWindow) , lastRequest(nullptr) , modbusDevice(nullptr) { ui->setupUi(this);
realTime=new QTimer(); realTime->stop(); connect(realTime,&QTimer::timeout,this,&MainWindow::readQuest);
tableModel=new QStandardItemModel(10,2,this);
tableModel->setHeaderData(0,Qt::Horizontal,tr("地址"),0); tableModel->setHeaderData(1,Qt::Horizontal,tr("实时值"),0); // tableModel->setHorizontalHeaderItem(2,new QStandardItem(tr("第三列")));
ui->tableView->setModel(tableModel); ui->tableView->setGridStyle(Qt::PenStyle(2)); ui->tableView->setAlternatingRowColors(1); }
实时读取:
- void MainWindow::realTimeReadReady()
{ auto reply = qobject_cast<QModbusReply *>(sender()); if (!reply) return;
QStandardItem *rtItem1; QStandardItem *rtitem2; if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); for (uint i = 0; i < unit.valueCount(); i++) { const QString rTValue=tr("%1").arg(unit.startAddress()+i); rtItem1=new QStandardItem(rTValue);//每次都要new 一个QStandardItem,长时间会发生内存泄漏吗? tableModel->setItem(i,0,rtItem1); // QString::number(unit.value(i)); rtitem2=new QStandardItem(QString::number(unit.value(i))); tableModel->setItem(i,1,rtitem2);
} } else if (reply->error() == QModbusDevice::ProtocolError) { statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). arg(reply->errorString()). arg(reply->rawResult().exceptionCode(), -1, 16), 5000); } else { statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)"). arg(reply->errorString()). arg(reply->error(), -1, 16), 5000); }
reply->deleteLater(); // delete rtItem1; //这样处理会删除最后一个数据 // delete rtitem2; }
或者有没有更好的办法来实现实时刷新功能,因为软件要长期运行的,非常感谢!
|
|