Escenas
escena del problema
Originalmente, se seleccionó QMap en la selección de proyectos para almacenar los pares clave-valor correspondientes, y los valores correspondientes se recuperaron de acuerdo con el orden de las claves en el Mapa. Pero en el proceso de uso, se encuentra que la misma clave se almacenará en el mapa, por lo que se sobrescribirá el valor anterior correspondiente a esta clave, lo que resultará en una falta final de un conjunto de datos.
Solución
Para los problemas anteriores, no quiero cambiar demasiado el código aquí, así que evaluaré la solución óptima.
opcion uno
Utilice QSet. Si bien soluciona el problema de que se puede almacenar la misma clave, también introduce un nuevo problema, es decir, aunque QSet es un par clave-valor, pero en el uso diario solo se almacena el valor, así QSet<doble>, no puede ser directamente Lograr el efecto de QMap<doble, QWidget*>.
Opción II
Utilice QMultiMap. Cambiar el tipo de datos almacenados de QMap directamente a QMultiMap parece que hay muy pocos códigos que necesitan ser modificados Parece que el código original solo necesita cambiar QMap a QMultiMap. Pero después de cambiar a QMultiMap, descubrí que al compilar una variable de tipo QMultiMap usando [], se informará un error. Se dice que no se puede acceder a la variable miembro privada []. Por lo tanto, no adopté este plan.
Opción tres (puntos clave)
Utilice el QMap de selección de variables original, pero antes de almacenar el par clave-valor en el QMap, primero determine si el valor de la misma clave ya está almacenado en el QMap.
Si la clave ya existe en QMap, utilice la función inertMulti(). Esta función puede guardar la misma clave en QMap.
Ejemplo para el Escenario Tres
A continuación se muestra un pequeño ejemplo simple.
// QMap型变量的声明如下
QMap<double, QWidget *> m_lesionMap;
void ClassWgt::saveLessionWidgetKeyIndex(const double &dKeyIndex,
QWidget *pWidget)
{
bool ret = mapIsAlreadyHasSameKeyLession(dKeyIndex);
if (ret) //相同的键采用insertMulti函数来保存到QMap中
{
m_lesionMap.insertMulti(dKeyIndex, pWidget);
}
else
{
m_lesionMap[dKeyIndex] = pWidget;
}
}
bool ClassWgt::mapIsAlreadyHasSameKeyLession(const double &dKeyIndex)
{
auto it = m_lesionMap.find(dKeyIndex);
while (it != m_lesionMap.end())
{
return true;
}
return false;
}