Qt qvariant作为qhash中的键

Qt qvariant作为qhash中的键,qt,key,qvariant,qhash,Qt,Key,Qvariant,Qhash,我想用qa键创建一个数据结构。看起来是这样的: QHash<QPair<QVariant, QVariant>, SHAPES::Shape* > _shapes; QHash\u形状; 不幸的是,“没有匹配的函数来调用'qHash(constqvariant&')” 因此,我为QVariants定义了自己的qHash实现: #pragma once #include <QVariant> #include <QHash> uint qHa

我想用qa键创建一个数据结构。看起来是这样的:

QHash<QPair<QVariant, QVariant>, SHAPES::Shape* > _shapes;
QHash\u形状;
不幸的是,“没有匹配的函数来调用'qHash(constqvariant&')”

因此,我为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;
}
#pragma一次
#包括
#包括
uint qHash(const QVariant&var)
{
如果(!var.isValid()| | var.isNull())
//返回-1;
Q_断言(0);
开关(变量类型())
{
案例QVariant::Int:
返回qHash(var.toInt());
打破
案例QVariant::UInt:
返回qHash(var.toUInt());
打破
案例QVariant::Bool:
返回qHash(var.toUInt());
打破
案例QVariant::Double:
返回qHash(var.toUInt());
打破
案例QVariant::LongLong:
返回qHash(变量toLongLong());
打破
案例QVariant::ULongLong:
返回qHash(变量toULongLong());
打破
大小写QVariant::字符串:
返回qHash(变量toString());
打破
案例QVariant::Char:
返回qHash(var.toChar());
打破
案例QVariant::StringList:
返回qHash(变量toString());
打破
案例QVariant::ByteArray:
返回qHash(变量toByteArray());
打破
案例QVariant::日期:
案例QVariant::时间:
案例QVariant::日期时间:
案例QVariant::Url:
案例QVariant::区域设置:
案例QVariant::RegExp:
返回qHash(变量toString());
打破
案例QVariant::映射:
案例QVariant::列表:
案例QVariant::位数组:
案例QVariant::大小:
案例QVariant::SizeF:
案例QVariant::Rect:
案例QVariant::LineF:
案例QVariant::行:
案例QVariant::RectF:
案例QVariant::点:
案例QVariant::PointF:
//还不支持
打破
案例QVariant::用户类型:
案例QVariant::无效:
违约:
返回-1;
}
//无法为给定变量生成哈希
返回-1;
}
但是编译器说,这个方法被定义了多次


那么,如何使用QVariant作为QHash中的键呢?或者:我做错了什么?

您的
qHash
实现似乎放在了头文件中。您需要在头文件中声明它,而无需实现:

uint qHash( const QVariant & var );
实现应该放在相应的源文件中


还要注意,
qHash()
声明应该放在
#include

之前,尝试将函数定义放在
qHash
include之前@asclepix您正在运行哪个版本的Qt?我在4.8或5.0中都看不到
qHash(QVariant)
。在我的例子中,在定义在Linux(gcc版本4.6.3)上运行Qt4.8.1之前,在定义中添加
inline
,并包括
qHash
,要求uint qHash(const QVariant&var);必须走在前面#include真的很讨厌,因为即使不包含QHash,如果在行的某个地方包含包含QHash的头,那么代码也不会编译。我可以先包含那个类,然后转发声明qHash函数来解决这个问题。哇,在包含头之前,我无法理解qHash定义的要求。我同意这是相当令人讨厌的。对于Linux上的Qt4.7.4(GCC4.4及以上版本),在include之前放置
qHash()。