问题与QMap和QDateTime作为关键

时间:2019-07-11 09:55:22

标签: c++ qt qt4.8 qmap qdatetime

我正在使用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
             ....

现在,当我尝试获取与“ Sun Dec 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错误。我将不胜感激。谢谢。

编辑: 调试后,根据调试信息,我发现与key#14关联的值等于与key#0关联的值! 看看这个: qt snapshot

在上图中,两个值被检测为相等。

2 个答案:

答案 0 :(得分:1)

我无法重现您的问题。但是有一点可以肯定,即使无效日期的初始化方式可能不同,无效日期也会映射到相同的值。

#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();
}

以下程序使用Qt 5.13.0打印2

#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();
}

答案 1 :(得分:0)

刚发现问题。这是由于dateTime规范。其中一些具有不同的规格