2012-03-06 1 views
3

私はQMultiMap<QDateTime, SomeOwnDataType>から、すべての値を特定のタイムスタンプで取得したいと思っています。これは私が何をすべきかです:QMultiMapの検索操作が期待どおりに機能しないのはなぜですか?

nowディ6. MRT 12時07分00秒2012の値を持つ
QMap<QDateTime, Appointment>::iterator it = _reminders.find(now); 

。これは私のループ条件である:

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

これは_remindersオブジェクトの状態だった:

私の予想に反して

Debug

、ループが完全にスキップされました。どうして?

+0

検索項目または有効な項目の後に "_reminders.end()"を指していますか? – Koying

+0

ループに入る前に 'it == _reminders.end()'の条件を調べました。ループが決して実行されないのは、真実です。しかし、なぜ? 'QDateTime'の比較演算子はこれと何か関係がありますか? – Pieter

答えて

4

私は問題は2つのタイムスタンプが等しくないということであると信じている。あなたは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; 
    } 
} 

しかし、時間が等しい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; 

それはあなたがちょうど2つのタイムスタンプ間の差が限度内であればチェックすると、より安全になります。例:

while (it != _reminders.end() && abs(now.msecsTo(it.key())) < aLimitInMsecs) { 
+0

D'oh ... msecコンポーネントを使用していないので、私はmsecコンポーネントをチェックしていませんでした。すべてのタイムスタンプでmilisecondコンポーネントを0に設定してこれを修正します。説明をありがとう! – Pieter

+0

あなたは大歓迎です – pnezis

0

nowはどのように初期化されますか?いくつかの点で重要な_reminders [0] nowの値に設定されていない限り

QDateTimeはミリ秒まで上昇するので、実際の値が異なっている間、toString()が同じ値を表示することができ... は、彼らは次のようになります異なる。

カレンダーアプリを構築している場合は、値は、あなたが喜んでいるの精度に依存QDateTime::toString()(形式(日、時間、分、出力されて、あなたのQMultiMapへの鍵としてQStringを使用する場合があります。 ...)

関連する問題