問題のシーン
もともと、QMap は対応するキーと値のペアを保存するためにプロジェクト選択で選択されており、対応する値はマップ内のキーの順序に従って取得されました。しかし、それを使用する過程で、同じキーがマップに格納されることが判明したため、このキーに対応する値が上書きされ、最終的にデータのセットが不足します。
解決
上記の問題に対して、ここではコードをあまり変更したくないので、最適な解決策をスクリーニングします。
オプション 1
QSetを使用します。同じキーを格納できるという問題は解決しますが、新たな問題も生じます。つまり、QSet はキーと値のペアですが、日常使用では、この QSet<double> のように値のみが格納されます。 QMap<double, QWidget*> の効果を直接実現することはできません。
オプション II
QMultiMapを使用します。格納されるデータの種類を QMap から QMultiMap に直接変更するには、変更する必要があるコードはほとんどないようで、元のコードを QMap から QMultiMap に変更するだけのようです。しかし、QMultiMap に変更した後、QMultiMap 型の変数をコンパイルするときに [] を使用するとエラーが報告されることがわかりました。プライベートメンバー変数[]にアクセスできないそうです。したがって、私はこの計画を採用しませんでした。
オプション 3 (重要なポイント)
元の変数選択 QMap を使用しますが、キーと値のペアを QMap に保存する前に、同じキーの値が既に QMap に保存されているかどうかを確認します。
キーが QMap にすでに存在する場合は、関数 inertMulti() を使用します。この機能は同じキーを QMap に保存できます。
シナリオ 3 の例
以下に簡単な例を示します。
// 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;
}