首页| 论坛| 消息
主题:tableView显示实时数据,会不会内存泄漏?
ssff5678发表于 2019-11-04 11:13
利用Qt modbus做了一个每秒读取串口数据的tableView,在为QStandardItemModel赋值时,每次都要newQStandardItem值,然后再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(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;
}或者有没有更好的办法来实现实时刷新功能,因为软件要长期运行的,非常感谢!
下一页 (1/2)
回帖(2):
2楼:Qt 内存管理通过父子对象之间的关联来管理的,父对象删除了,对应的子对象都会被删除,而子对象 ..
1楼:曾经我的也纠结过这个问题,最后大批量测试发现不会内存泄漏,不用手动delete,放心试用
qt ..

全部回帖(2)»
最新回帖
收藏本帖
发新帖