web-dev-qa-db-ja.com

C ++ Qtで静的QMapの値を設定するにはどうすればよいですか?

これは私の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

静的QMapCOLUMN_NAMESに値を追加したいと思います。どこでどのようにこれを行うのですか?

17
Di Zou

それまでの間、Qt5.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}};
38
Luchs

イニシャライザリストを使用する別のアプローチ。

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

これは、Qtがイニシャライザリストを直接操作するように修正される前の古いQtで機能します。

5
Al Conrad

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);

もう1つの方法は、コンストラクターでCOLUMN_NAMESを初期化することです。

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

ただし、これはスレッドセーフではありません。最初のメソッドはmainの前に呼び出され、2番目のメソッドは実行時に呼び出される可能性があります。

1
fghj