c++ - 入門 - visualstudio 2017 qt インストール




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

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

別の方法は、コンストラクタでinit COLUMN_NAMESです。

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

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

私はこれを私の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に値を追加したいと思います。 どこでどのようにすればいいですか?


初期化されたマップを返す静的関数を使用することができます:

// 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最初に呼び出す必要がある場合は、静的変数をゲッター関数に移動することをお勧めします。

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_NAMESgetColumnNames()最初の呼び出しで初期化され、事前にテキストコーデックを設定することができます。 しかし、これはスレッドセーフではありません。


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

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

これはQtが修正されてからイニシャライザリストを直接操作するようになる以前のQtで動作します。





qt4