Почему операция поиска QMultiMap не работает так, как я ожидал? - PullRequest
3 голосов
/ 06 марта 2012

У меня есть QMultiMap<QDateTime, SomeOwnDataType>, из которого я хотел бы получить все значения с определенной отметкой времени.Вот что я делаю:

QMap<QDateTime, Appointment>::iterator it = _reminders.find(now);

, где now имеет значение ди 6. mrt 12:07:00 2012 .Это условие моего цикла:

while (it != _reminders.end() && it.key() == now) {

Это было состояние объекта _reminders:

Debug

Вопреки моим ожиданиям цикл был пропущенполностью.Как получилось?

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

Я считаю, что проблема в том, что две метки времени не равны.Если вы проверите код оператора ==, равный QDateTime, вы увидите, что равенство выполняется, если время и дата равны.

bool QDateTime::operator==(const QDateTime &other) const
{
    if (d->spec == other.d->spec && d->utcOffset == other.d->utcOffset)
        return d->time == other.d->time && d->date == other.d->date;
    else {
        QDate date1, date2;
        QTime time1, time2;

        d->getUTC(date1, time1);
        other.d->getUTC(date2, time2);
        return time1 == time2 && date1 == date2;
    }
}

Но оператор равенства времени сравнивает миллисекунды:

bool operator==(const QTime &other) const { return mds == other.mds; }

где mds - время в миллисекундах.В QTime конструктор mds рассчитывается следующим образом:

 mds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;

Было бы безопаснее, если бы вы только что проверили, находится ли разница между двумя временными метками в пределах лимита.Например:

while (it != _reminders.end() && abs(now.msecsTo(it.key())) < aLimitInMsecs) {
0 голосов
/ 06 марта 2012

Как вы инициализируете now?

QDateTime идет до миллисекунды, поэтому toString() может отображать одно и то же значение, хотя на самом деле значения отличаются ... Если в какой-то момент ключ _reminders [0] не будет установлен в значение now, они будут другими.

Если вы создаете приложение календаря, вы можете использовать QString в качестве ключа к QMultiMap, со значениями, являющимися выходными данными QDateTime::toString() (формат зависит от желаемой вами точности (день, часы, минуты, ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...