2012-03-06 125 views
3

我有一個QMultiMap<QDateTime, SomeOwnDataType>我想從中檢索具有特定時間戳的所有值。這是我做的:爲什麼QMultiMap的查找操作無法按預期工作?

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

其中now迪6.地鐵12點07分00秒2012的值。這是我的循環狀態:

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

這是_reminders對象的狀態:

Debug

出乎我的意料,循環被完全忽略。怎麼來的?

+0

是「它」指向「_reminders.end()」後查找或有效的項目? – Koying 2012-03-06 12:17:39

+0

在進入循環之前,我檢查了'it == _reminders.end()'的條件。這是真的,這就是爲什麼循環從未被執行。但爲什麼? 「QDateTime」的比較運算符可以與此有關嗎? – Pieter 2012-03-06 12:42:45

回答

4

我認爲,問題是兩個時間戳是不相等的。如果你檢查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

D'oh ...我沒有想到檢查msec組件,因爲我沒有使用它們。我將通過在所有時間戳上將毫秒組件設置爲0來解決此問題。感謝您的解釋! – Pieter 2012-03-06 13:18:57

+0

不客氣 – pnezis 2012-03-06 13:20:18

0

如何初始化now

QDateTime上升到毫秒,所以,而實際上的值是不同toString()可以顯示相同的值... 除非在某個時刻的關鍵_reminders [0]設置爲now的價值,他們將不同。

如果你正在構建一個日曆應用程序,你可以使用一個QString爲重點,以你的QMultiMap,與值是的QDateTime::toString()輸出(取決於您願意精度(日,小時,分鐘的格式。 ..)

相關問題