QMap を使用してデータを保存するときに、同じキーが表示される場合は、insertMulti 関数を使用して、元の変数ストレージの選択を変更せずに問題を解決できます。

問題のシーン

もともと、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;
}

おすすめ

転載: blog.csdn.net/blqzj214817/article/details/130013433