【问题标题】:qvariant as key in qhashqvariant 作为 qhash 中的键
【发布时间】:2013-06-20 08:29:34
【问题描述】:

我想创建一个带有 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 作为键?或者:我做错了什么?

【问题讨论】:

  • 尽量把函数定义放在QHashinclude之前。
  • 我编译没有问题:QHash, QVariant > _shapes;
  • @asclepix 你运行的是什么版本的 Qt?我在 4.8 或 5.0 中都看不到 qHash(QVariant)
  • 好吧,在我的例子中,在定义中添加 inline 并在定义完成之前包含 QHash
  • Linux 上的 Qt 4.8.1(gcc 版本 4.6.3)

标签: qt key qvariant qhash


【解决方案1】:

您的qHash 实现似乎放在头文件中。您需要在头文件中声明它而不执行:

uint qHash( const QVariant & var );

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

还要注意qHash()声明应该放在#include &lt;QHash&gt;之前。

【讨论】:

  • 要求 uint qHash( const QVariant & var );必须在 #include 非常讨厌之前进行,因为即使您不包含 QHash,如果您在后面的某处包含包含 QHash 的标头,那么代码将无法编译。我能够通过首先包含该类并转发声明 qHash 函数来解决此问题。
  • 哇,我无法理解在包含标头之前定义qHash的要求。我同意这很讨厌。
  • 在 Linux 上的 Qt 4.7.4(GCC 4.4 及更高版本)似乎不需要在包含之前放置 qHash()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多