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

Di *_*Zou 16 c++ qt qt4

我在我的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
};
Run Code Online (Sandbox Code Playgroud)

这是我的C++源文件:

#include "LogEvent.h"

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

//blah blah blah other functions
Run Code Online (Sandbox Code Playgroud)

我想为静态QMap COLUMN_NAMES添加值.我在哪里以及如何做到这一点?

Luc*_*chs 37

与此同时,Qt 5.2在QMap中添加了对C++ 11初始化列表的支持:

QMap::?QMap(std::initializer_list<std::pair<Key, T> > list)
Run Code Online (Sandbox Code Playgroud)

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

static QMap<QString, int> my_map{{"a", 1}, {"b", 2}, {"c", 3}};
Run Code Online (Sandbox Code Playgroud)

  • 我只是尝试了这种方法而且它没有编译,同时所有的otehr C++ 11功能都可以工作.... lambdas等,你确定它实际上已经实现了吗?我正在使用QT5.3.1错误:没有匹配函数来调用'QMap <QString,int> :: QMap(<brace-enclosed initializer list>)' (2认同)
  • 为了完整性:如果地图已在其他地方声明,您可以使用以下内容对其进行初始化:`this-> m_map = QMap <QString,int>({{"a",1},{"b",2},{ "c",3}});` (2认同)

小智 16

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

// 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();
Run Code Online (Sandbox Code Playgroud)

另外,如果你想在静态变量中使用字符串国际化并且需要先调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式COLUMN_NAMES将通过第一次调用初始化,getColumnNames()您可以预先设置文本编解码器.但这不是线程安全的.


Al *_*rad 5

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

QMap<QString, QString> qmap_(std::map<QString, QString> {{ "", "" }});
Run Code Online (Sandbox Code Playgroud)

在将Qt固定为直接与初始化程序列表一起使用之前,这适用于较旧的Qt。