Как мне заполнить значения статического QMap в C ++ Qt? - PullRequest
16 голосов
/ 16 ноября 2011

У меня есть это в моем заголовочном файле C ++:

#include <QMap>
#include <QString>

class LogEvent {

public:
    LogEvent();

    enum column_t {TIMESTAMP_COLUMN = 0, TYPE_COLUMN = 1, EVENT_COLUMN = 2,
        FILE_COLUMN = 3};
    static QMap<column_t, QString> COLUMN_NAMES;

    static QMap<column_t, QString> getColumnNames() {
        return LogEvent::COLUMN_NAMES;
    }

    //blah blah blah other functions
};

Это мой исходный файл C ++:

#include "LogEvent.h"

LogEvent::LogEvent()
{
    //constructor code
}

//blah blah blah other functions

Я хочу добавить значения в мой статический QMap COLUMN_NAMES. Где и как мне это сделать?

Ответы [ 4 ]

35 голосов
/ 16 февраля 2015

Тем временем, в Qt 5.2 добавлена ​​поддержка списков инициализаторов C ++ 11 в QMap:

QMap::​QMap(std::initializer_list<std::pair<Key, T> > list)

Это означает, что вы можете инициализировать вашу карту следующим образом:

static QMap<QString, int> my_map{{"a", 1}, {"b", 2}, {"c", 3}};
15 голосов
/ 17 ноября 2011

Вы можете использовать статическую функцию, которая возвращает инициализированную карту:

// source file:
QMap<column_t, QString> LogEvent::initColumnNames() {
    QMap<column_t, QString> map;
    map.insert(LogEvent::TIMESTAMP_COLUMN,"Timestamp");
    // and so on
    return map;
}

QMap<column_t, QString> LogEvent::COLUMN_NAMES = initColumnNames();

Также, если вы хотите использовать интернационализацию строк в статических переменных и вам нужно сначала вызвать QTextCodec::setCodecForTr, это хорошая идея дляпереместите статическую переменную в ее функцию получения:

class LogEvent {

public:
// ...
    static QMap<column_t, QString> initColumnNames();

    static QMap<column_t, QString> getColumnNames() {
        static QMap<column_t, QString> COLUMN_NAMES = initColumnNames();
        return COLUMN_NAMES;
    }
}

Таким образом COLUMN_NAMES будет инициализирован с первым вызовом getColumnNames(), и вы можете заранее установить текстовый кодек.Но это не потокобезопасно.

5 голосов
/ 31 марта 2016

Другой подход с использованием списка инициализаторов.

QMap<QString, QString> qmap_(std::map<QString, QString> {{ "", "" }});

Это работает для более старого Qt до того, как Qt был исправлен, для непосредственной работы со списками инициализаторов.

1 голос
/ 16 ноября 2011

Вы можете создать std :: map и использовать его для инициализации QMap или просто заменить QMap на std :: map:

 static const std::pair<T1, T2> arr[] = { 
     std::pair<T1, T2>(v1, v2),
     std::pair<T1, T2>(v3, v4),
};

static std::map<T1, T2> my_map(arr, arr + sizeof(arr) / sizeof(arr[0]));
QMap<column_t, QString> LogEvent::COLUMN_NAMES(my_map);

Другой способ - инициализация COLUMN_NAMES в конструкторе:

LogEvent::LogEvent() {
   if (COLUMN_NAMES.isEmpty())
     ;//init it here

но это не потокобезопасно, первый метод был вызван до main, а второй во время может быть вызван во время выполнения.

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