2013-06-20 50 views
3

我想用QVariants鍵創建數據結構。它看起來像這樣:qvariant作爲qhash中的鍵

QHash<QPair<QVariant, QVariant>, SHAPES::Shape* > _shapes; 

不幸的是,「呼叫沒有匹配函數‘qHash(常量的QVariant &)’」。

所以我定義我自己的QVariants實施qHash的:

#pragma once 

#include <QVariant> 
#include <QHash> 

uint qHash(const QVariant & var) 
{ 
    if (!var.isValid() || var.isNull()) 
     //return -1; 
     Q_ASSERT(0); 

    switch (var.type()) 
    { 
     case QVariant::Int: 
       return qHash(var.toInt()); 
      break; 
     case QVariant::UInt: 
       return qHash(var.toUInt()); 
      break; 
     case QVariant::Bool: 
       return qHash(var.toUInt()); 
      break; 
     case QVariant::Double: 
       return qHash(var.toUInt()); 
      break; 
     case QVariant::LongLong: 
       return qHash(var.toLongLong()); 
      break; 
     case QVariant::ULongLong: 
       return qHash(var.toULongLong()); 
      break; 
     case QVariant::String: 
       return qHash(var.toString()); 
      break; 
     case QVariant::Char: 
       return qHash(var.toChar()); 
      break; 
     case QVariant::StringList: 
       return qHash(var.toString()); 
      break; 
     case QVariant::ByteArray: 
       return qHash(var.toByteArray()); 
      break; 
     case QVariant::Date: 
     case QVariant::Time: 
     case QVariant::DateTime: 
     case QVariant::Url: 
     case QVariant::Locale: 
     case QVariant::RegExp: 
       return qHash(var.toString()); 
      break; 
     case QVariant::Map: 
     case QVariant::List: 
     case QVariant::BitArray: 
     case QVariant::Size: 
     case QVariant::SizeF: 
     case QVariant::Rect: 
     case QVariant::LineF: 
     case QVariant::Line: 
     case QVariant::RectF: 
     case QVariant::Point: 
     case QVariant::PointF: 
      // not supported yet 
      break; 
     case QVariant::UserType: 
     case QVariant::Invalid: 
     default: 
      return -1; 
    } 

    // could not generate a hash for the given variant 
    return -1; 
} 

但隨後的編譯器說,該方法被定義多次。

那麼,如何使用QVariant作爲QHash中的鍵?或者:我做錯了什麼?

+1

嘗試在'QHash'包含之前放置函數定義。 –

+1

我沒有問題編譯:QHash ,QVariant> _shapes; – asclepix

+0

@asclepix你正在運行什麼版本的Qt?我無法在4.8或5.0中看到'qHash(QVariant)'。 – cmannett85

回答

5

看來您的qHash實現被放置在頭文件中。您需要在不執行的情況下在頭文件中聲明它:

uint qHash(const QVariant & var); 

實現應該放在各自的源文件中。

另請注意,qHash()聲明應放置在#include <QHash>之前。

+0

需要 uint qHash(const QVariant&var) ; 必須去之前 #include 真的很討厭,因爲即使你不包含QHash,如果你包含一個包含QHash某處下的頭,那麼代碼將不會編譯。我能夠通過首先包含這個類來解決這個問題,然後轉發聲明qHash函數。 – dmiller309

+0

哇,我無法理解在包含標題之前對qHash定義的要求。我同意這非常討厭。 –

+0

在Linux(GCC 4.4及更高版本)上,Qt 4.7.4似乎不需要在include之前放置'qHash()'。 – Murphy