4

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;
}

しかし、コンパイラは、メソッドが複数回定義されていると言います。

では、QVariant を QHash のキーとして使用するにはどうすればよいでしょうか? または:私は何を間違っていますか?

4

1 に答える 1

5

あなたのqHash実装はヘッダーファイルに配置されているようです。実装せずにヘッダーファイルで宣言する必要があります:

uint qHash( const QVariant & var );

実装は、それぞれのソース ファイルに配置する必要があります。

また、qHash()宣言は の前に配置する必要があることに注意してください#include <QHash>

于 2013-06-20T13:20:56.293 に答える