繁体   English   中英

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

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

我在我的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)

这意味着您可以像这样初始化地图:

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

您可以使用返回初始化地图的静态函数:

// 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> {{ "", "" }});

这适用于Qt修复后直接使用初始化列表之前的旧Qt。

你可以创建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);

另一种方法是在构造函数中初始化COLUMN_NAMES:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM