Как переопределить функцию qHa sh ()? - PullRequest
1 голос
/ 16 января 2020

Я хотел бы использовать QSet настроенного объекта. Из документации я узнал, что:

Тип данных значения QSet должен быть назначаемым типом данных. Вы не можете, например, сохранить QWidget как значение; вместо этого сохраните QWidget *. Кроме того, тип должен предоставлять operator == (), а также должна быть глобальная функция qHa sh (), которая возвращает значение ha sh для аргумента типа ключа. См. Документацию QHa sh для списка типов, поддерживаемых qHa sh ().

Следующий код представляет struct, который я хотел бы использовать:

typedef struct ShortcutItem
{
    QString     shortcutName;   // A shortcut name
    QString     explaination;   // A shortcut explaination
    bool        editable;       // Is editable
    KeySequence sequence;       // A list of key values defining a shortcut

    ShortcutItem(void) {}
    ShortcutItem(QString& name, QString& description, bool enabled, KeySequence seq) : shortcutName(name), explaination(description), editable(enabled), sequence(seq) {}
    ShortcutItem(const ShortcutItem& other) : shortcutName(other.shortcutName), explaination(other.explaination), editable(other.editable), sequence(other.sequence) {}
    bool ShortcutItem::operator==(const ShortcutItem& other) const { return shortcutName == other.shortcutName; }
} ShortcutItem;

До сих пор я перегрузил оператор ==, но не могу определить, что делать с функцией qHash().

Любая помощь, пожалуйста.

PS Я видел этот пост и не может решить, что делать.

1 Ответ

1 голос
/ 16 января 2020

Насколько я вижу из вашего кода, ваша хеш-функция должна выглядеть следующим образом:

uint qHash(const ShortcutItem & item)
{
    return qHash(item.shortcutName);
}

Другими словами, вы можете использовать доступную перегрузку uint qHash(const QString &key, uint seed = ...), передать элемент элемента shortcutName в и просто вернуть его возвращаемое значение.

Вы можете поместить прототип функции после структуры ShortcutItem в самом ее заголовке:

uint qHash(const ShortcutItem & item);

и определение (выше) в его файл реализации (. cpp).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...