qt - qvariant 作为 qhash 的关键

标签 qt key qvariant qhash

我想创建一个带有 QVariants 键的数据结构。它看起来像这样:

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

不幸的是,“没有匹配的函数来调用‘qHash(const 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;
}

但是随后编译器说,该方法被定义了多次。

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

最佳答案

看来你的 qHash实现放在一个头文件中。您需要在头文件中声明它而无需实现:

uint qHash( const QVariant & var );

实现应该放在各自的源文件中。

另请注意 qHash()声明应放在#include <QHash>之前.

关于qt - qvariant 作为 qhash 的关键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208813/

相关文章:

c++ - 在 Windows 7 上崩溃但在 XP 上运行

c++ - 无法检查带有 value() 的 QVariant 转换

qt - 将 QVariant 转换为 QStringList

python - 如何检测 PyQT 中的父窗口小部件关闭?

c++ - 根据字体句柄获取字体文件名 (HFONT)

eclipse - 隐藏的键绑定(bind)(?)

Redis 集群 : how to delete all keys for a specific hashtag

c++ - 如何将 QVariant::fromValue 与 QString 一起使用?

c++ - 未定义的静态模板函数引用

json - 如何使用jq交换对象的键和值?