如何在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)
这意味着你可以这样初始化你的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之前被调用,而第二个方法在运行时可能被调用
相关文章:
- 在c++中用vector填充一个简单的动态数组
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- 使用 C++98 标准填充二维静态向量
- 在子类中填充静态类成员
- DLL – 在 DLL 初始化时填充的静态向量,向客户端程序返回零大小
- C++初始化/填充静态成员 std::数组元素到特定值
- 静态"global"向量似乎未填充
- 如何填充循环模板派生类的静态成员
- 填充静态unordered_map局部变量
- 如何使用静态函数填充静态 std::map
- (VS2015)正在尝试用初始值设定项列表中的数据填充静态映射
- 在代码中的同一位置最有效地填充静态标题列表和动态值列表
- C++填充静态值数组
- 如何将可变大小的静态数组设置为用 0 填充
- 如何在c++ Qt中填充静态QMap的值