Проблема с QMap и QDateTime в качестве ключа - PullRequest
1 голос
/ 11 июля 2019

Я использую Qt 4.8.6 msvc 2010. Я работаю над программным обеспечением (это сделано до Qt5, сейчас я поддерживаю). Я использовал карту:

QMap<QDateTime, quint32> dateTime

После того, как я вставлю некоторые данные в эту карту (например, с 5000 данных) и захочу получить значение указанного ключа, возвращаемое значение будет неправильным. Чтобы сделать это более понятным, предположим, что есть следующие 20 лучших элементов карты:

            [0] Sun Dec 2 23:00:00 2018 0   
                key Sun Dec 2 23:00:00 2018 QDateTime
                value   0   unsigned int
            [1] Sun Dec 2 23:15:00 2018 1   
                key Sun Dec 2 23:15:00 2018 QDateTime
                value   1   unsigned int
            [2] Sun Dec 2 23:30:00 2018 2   
                key Sun Dec 2 23:30:00 2018 QDateTime
                value   2   unsigned int
            [3] Sun Dec 2 23:45:00 2018 3   
                key Sun Dec 2 23:45:00 2018 QDateTime
                value   3   unsigned int
            [4] (invalid)   4   
                key (invalid)   QDateTime
                value   4   unsigned int
            [5] Mon Dec 3 00:15:00 2018 5   
                key Mon Dec 3 00:15:00 2018 QDateTime
                value   5   unsigned int
            [6] Mon Dec 3 00:30:00 2018 6   
                key Mon Dec 3 00:30:00 2018 QDateTime
                value   6   unsigned int
            [7] Mon Dec 3 00:45:00 2018 7   
                key Mon Dec 3 00:45:00 2018 QDateTime
                value   7   unsigned int
            [8] Mon Dec 3 01:00:00 2018 8   
                key Mon Dec 3 01:00:00 2018 QDateTime
                value   8   unsigned int
            [9] Mon Dec 3 01:15:00 2018 9   
                key Mon Dec 3 01:15:00 2018 QDateTime
                value   9   unsigned int
            [10] Mon Dec 3 01:30:00 2018    10  
                key Mon Dec 3 01:30:00 2018 QDateTime
                value   10  unsigned int
            [11] Mon Dec 3 01:45:00 2018    11  
                key Mon Dec 3 01:45:00 2018 QDateTime
                value   11  unsigned int
            [12] Mon Dec 3 02:00:00 2018    12  
                key Mon Dec 3 02:00:00 2018 QDateTime
                value   12  unsigned int
            [13] Mon Dec 3 02:15:00 2018    13  
                key Mon Dec 3 02:15:00 2018 QDateTime
                value   13  unsigned int
            [14] Mon Dec 3 02:30:00 2018    14  
                key Mon Dec 3 02:30:00 2018 QDateTime
                value   14  unsigned int
            [15] Mon Dec 3 02:45:00 2018    15  
                key Mon Dec 3 02:45:00 2018 QDateTime
                value   15  unsigned int
            [16] Mon Dec 3 03:00:00 2018    16  
                key Mon Dec 3 03:00:00 2018 QDateTime
                value   16  unsigned int
            [17] Mon Dec 3 03:15:00 2018    17  
                key Mon Dec 3 03:15:00 2018 QDateTime
                value   17  unsigned int
            [18] Mon Dec 3 03:30:00 2018    18  
                key Mon Dec 3 03:30:00 2018 QDateTime
                value   18  unsigned int
            [19] Mon Dec 3 03:45:00 2018    19  
                key Mon Dec 3 03:45:00 2018 QDateTime
                value   19  unsigned int
            [20] Mon Dec 3 04:00:00 2018    20  
                key Mon Dec 3 04:00:00 2018 QDateTime
                value   20  unsigned int
             ....

Теперь, когда я пытаюсь получить значение, связанное с ключом «Солнце 2 декабря 23:00:00 2018», код возвращает мне 14! но правильное значение должно быть 0 ясно (на основе значений карты). Это код, который я использовал:

            quint32 mapValue = dateTime.value(date); // date is "Sun Dec 2 23:00:00 2018"

Я пишу qt более 8 лет (но в основном Qt5), и это кажется действительно странным. Возможно, это неправильный способ определения карты, или это ошибка Qt4.8. Я буду признателен за любую помощь. Благодаря.

Edit: После отладки я обнаружил, что значение, связанное с ключом # 14, равно значению, связанному с ключом # 0, согласно информации отладки! Проверьте это: qt snapshot

На изображении выше два значения равны.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Я не смог воспроизвести вашу проблему.Но одно можно сказать наверняка: недопустимые даты отображаются на одно и то же значение, даже если они могут быть инициализированы по-разному.

#include <QDateTime>
#include <QDebug>
#include <QMap>
int main(int argc, char** args) {
    QMap<QDateTime, quint32> map;

    map.clear();
    for (auto iter=0; iter< 10000; iter++)
    {
        QDateTime invalidDateTime;
        map[invalidDateTime] = iter;
    }
    qDebug() << map.size();
}

Следующая программа печатает 2 с использованием Qt 5.13.0:

#include <QDateTime>
#include <QDebug>
#include <QMap>

int main(int argc, char** args) {
    QMap<QDateTime, quint32> map;

    QDateTime time1(QDate(2018, 12, 3), QTime(2, 30, 0));
    QDateTime time2(QDate(2018, 12, 3), QTime(23, 0, 0));

    map.insert(time1,0);
    map.insert(time2, 1);
    qDebug() << map.size();
}
0 голосов
/ 11 июля 2019

Только что нашел проблему.Это было связано со спецификациями dateTime.У некоторых из них были разные характеристики

...