refachor:将自定义结构体中的QCustomPlot对象更改为QPointer,防止悬垂指针问题

This commit is contained in:
duanshengchao 2025-08-01 10:42:49 +08:00
parent 323d7447ee
commit 352c0b6b39
2 changed files with 29 additions and 12 deletions

View File

@ -100,7 +100,8 @@ protected:
QString dataID; QString dataID;
QColor color; QColor color;
RealTimeDataType dataType; RealTimeDataType dataType;
QCPGraph* qGraph = nullptr; //QCPGraph* qGraph = nullptr;
QPointer<QCPGraph> qGraph;
}; };
}; };

View File

@ -235,13 +235,6 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
axisCfgMap.insert(it.key(), axisConfig); axisCfgMap.insert(it.key(), axisConfig);
} }
//QHash::insert()的第二个参数接收的是副本(引起拷贝),所以采用指针可以减少拷贝从而提升效率
QHash<RealTimeDataType, Axis*> axesMap;
for(auto& axis : m_axes)
{
axesMap.insert(axis._cfg.dataType, &axis);
}
//删除轴 //删除轴
for(int i = 0; i < m_axes.size();) for(int i = 0; i < m_axes.size();)
{ {
@ -262,7 +255,7 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
Axis& axis = m_axes[i]; Axis& axis = m_axes[i];
if(!axisCfgMap.contains(axis._cfg.dataType)) if(!axisCfgMap.contains(axis._cfg.dataType))
{ {
//先删除轴上的Graph(注意先后顺序QCustomPlot的removeGraph会析构graph所以先做m_graphs的删除) //先删除轴上的Graph(注意先后顺序QCustomPlot的removeGraph会析构graph所以先做m_graphs的删除或者改为QPointer智能指针可规避此问题)
// for(auto it = m_graphs.begin(); it != m_graphs.end();) // for(auto it = m_graphs.begin(); it != m_graphs.end();)
// { // {
// if(it.value().qGraph && it.value().qGraph->valueAxis() == axis.qAxis) // if(it.value().qGraph && it.value().qGraph->valueAxis() == axis.qAxis)
@ -274,7 +267,7 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
while (it.hasNext()) while (it.hasNext())
{ {
it.next(); it.next();
if (it.value().qGraph && it.value().qGraph->valueAxis() == axis.qAxis) if (it.value().qGraph.isNull() || it.value().qGraph->valueAxis() == axis.qAxis)
it.remove(); // 直接删除当前项,无需手动管理迭代器 it.remove(); // 直接删除当前项,无需手动管理迭代器
} }
for(int j = 0; j < m_pCustomPlot->graphCount(); j++) for(int j = 0; j < m_pCustomPlot->graphCount(); j++)
@ -297,6 +290,12 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
m_pCustomPlot->xAxis->setVisible(true); m_pCustomPlot->xAxis->setVisible(true);
//处理应用配置(新增或更新) //处理应用配置(新增或更新)
QHash<RealTimeDataType, Axis*> axesMap; //创建map类型变量,方便后续使用.QHash::insert()的第二个参数接收的是副本(引起拷贝),所以采用指针可以减少拷贝从而提升效率
for(auto& axis : m_axes)
{
axesMap.insert(axis._cfg.dataType, &axis);
}
for(int i = 0; i < cfg.m_pModel_dataType->rowCount(); i++) //能保证和选取顺序一致 for(int i = 0; i < cfg.m_pModel_dataType->rowCount(); i++) //能保证和选取顺序一致
//for(auto it = axisCfgMap.begin(); it != axisCfgMap.end(); ++it) //for(auto it = axisCfgMap.begin(); it != axisCfgMap.end(); ++it)
{ {
@ -356,6 +355,7 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
axis.setQCPAxis(pAxis, false); axis.setQCPAxis(pAxis, false);
} }
m_axes.append(axis); m_axes.append(axis);
axesMap.insert(axis._cfg.dataType, &axis); //临时变量axesMap通过做更新
#endif #endif
} }
} }
@ -365,19 +365,35 @@ void dpLineChart::synchronizeConfigData(const configurationResults& cfg)
arrangeAxes(); arrangeAxes();
//2.曲线-数据源决定 //2.曲线-数据源决定
QVector<Graph> deleteGraphs; QList<Graph> deleteGraphs;
for(int i = 0; i < cfg.m_pModel_dataSource->rowCount(); i++) for(int i = 0; i < cfg.m_pModel_dataSource->rowCount(); i++)
{ {
QString stationID = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_stationID).toString(); QString stationID = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_stationID).toString();
QString compoentID = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_componentID).toString(); QString compoentID = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_componentID).toString();
QString pointID = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_pointID).toString(); QString pointID = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_pointID).toString();
QString graphID = stationID + "-" + compoentID + "-" + pointID; QString graphID = stationID + "-" + compoentID + "-" + pointID;
if(!m_graphs.contains(graphID)) if(!m_graphs.contains(graphID)) //新增数据
{ {
RealTimeDataType dataType = (RealTimeDataType)cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_dataType).toInt(); RealTimeDataType dataType = (RealTimeDataType)cfg.m_pModel_dataSource->item(i, 0)->data(Qt::UserRole + itemRole_dataType).toInt();
QCPAxis* valueAxis = axesMap.value(dataType)->qAxis;
if(valueAxis == nullptr)
continue;
Graph graph; Graph graph;
graph.dataID = graphID; graph.dataID = graphID;
graph.dataType = dataType; graph.dataType = dataType;
QCPGraph* newGraph = m_pCustomPlot->addGraph(m_pCustomPlot->xAxis, valueAxis);
if(newGraph)
{
QVariant colorData = cfg.m_pModel_dataSource->item(i, 0)->data(Qt::DecorationRole);
if(colorData.isValid())
{
QColor color = colorData.value<QColor>();
newGraph->setPen(QPen(color));
}
graph.qGraph = newGraph;
m_graphs.insert(graphID, graph);
}
} }
else else
{ {