如何在c++ Qt中填充静态QMap的值

How do I populate values of a static QMap in C++ Qt?

本文关键字:填充 静态 QMap 的值 Qt c++      更新时间:2023-10-16

在我的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添加值。我该在哪里,怎么做?

同时,Qt 5.2在QMap中增加了对c++ 11初始化列表的支持:

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

这意味着你可以这样初始化你的map:

static QMap<QString, int> my_map{{"a", 1}, {"b", 2}, {"c", 3}};

可以使用静态函数返回初始化后的map:

// 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,那么将静态变量移动到它的getter函数中是一个好主意:

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()的第一次调用初始化,您可以事先设置文本编解码器。但这不是线程安全的

另一种使用初始化列表的方法。

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

您可以创建std::map并使用它来初始化QMap,或者直接用std::map:

替换QMap
 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);
另一种方法是在构造函数中init COLUMN_NAMES:
LogEvent::LogEvent() {
   if (COLUMN_NAMES.isEmpty())
     ;//init it here

但是这不是线程安全的,第一个方法在main之前被调用,而第二个方法在运行时可能被调用