2012-03-06 2 views
3

나는 QMultiMap<QDateTime, SomeOwnDataType>에서 모든 값을 특정 타임 스탬프로 검색하고 싶습니다. 이것은 내가 할 것입니다 : now디 6. MRT 12시 7분 0초 2012의 값이QMultiMap의 찾기 작업이 예상대로 작동하지 않는 이유는 무엇입니까?

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

.

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

_reminders 객체의 상태였다 내 예상과는 달리

Debug

는, 루프가 완전히 건너 뛴이 내 루프 조건이다. 어째서?

+0

찾기 또는 올바른 항목 뒤에 "it"이 "_reminders.end()"를 가리 킵니까? – Koying

+0

루프에 들어가기 전에'it == _reminders.end()'의 조건을 검사했습니다. 루프가 실행되지 않는 이유는 사실입니다. 하지만 왜? 'QDateTime'의 비교 연산자가 이것과 관련이 있습니까? – Pieter

답변

4

.

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; 
    } 
} 

하지만 시간이 같음 operat 또는 밀리 초를 비교한다 mds는 밀리 초 단위 시간

bool operator==(const QTime &other) const { return mds == other.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

D' oh ... msec 구성 요소를 사용하지 않았으므로 확인하지 못했습니다. 모든 타임 스탬프에서 milisecond 구성 요소를 0으로 설정하여이 문제를 해결할 것입니다. 설명 주셔서 감사합니다! – Pieter

+0

당신은 환영합니다 – pnezis

0

now은 어떻게 초기화합니까? 어떤 시점에서 키 _reminders [0] now 값으로 설정되어 있지 않으면

QDateTime는 밀리 세컨드로 상승하므로 실제로 값이 다를 동안 toString() 동일한 값을 표시 할 수 ... , 그들은 것 다른. 당신이 캘린더 응용 프로그램을 구축하는 경우

, 당신은, 값이 QDateTime::toString()의 출력 (당신이 기꺼이 정밀도 (일, 시간, 분에 따라 형식 인으로, 당신의 QMultiMap의 열쇠로 QString을 사용할 수 있습니다. ..)

나는 문제가 두 개의 타임 스탬프가 동일하지 않은 것으로 믿습니다. 당신이 QDateTime== 운영자 코드를 선택하면 시간과 날짜가 모두 동일한 경우 평등이 보유하고 있음을 볼 수
관련 문제