2011-11-16 19 views
12

benim C++ başlık dosyasında bu var: Ben statik QMap COLUMN_NAMES değerleri eklemek istediğinizC++ Qt'deki statik QMap değerlerini nasıl doldururum?

#include "LogEvent.h" 

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

//blah blah blah other functions 

:

#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 
}; 

Bu benim C++ kaynak dosyasıdır. Bunu nerede ve nasıl yaparım?

+1

Bazı C++ 11 desteği eklemek için Qt zamanı! –

cevap

14

: Statik değişkenlerde dizeleri uluslararasılaşma kullanabilir ve ilk QTextCodec::setCodecForTr çağırmanız gerekir istediğiniz durumda

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

Ayrıca, statik değişkeni taşımak için iyi bir fikirdir onun alıcı fonksiyonuna içine:

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

Bu şekilde COLUMN_NAMESgetColumnNames() ilk çağrısı ile başlatılır ve önceden metin codec'i ayarlayabilirsiniz. Ama bu iplik güvenli değildir. Bu arada

+0

Teşekkürler. İş parçacığı güvenli hakkında hızlı soru. Bu işlevin bir ileti dizisi olmadığını söylediğinizde, uygulamanızın çok iş parçacıklı olması durumunda sorunların doğru olabileceğini mi söylüyorsunuz? –

+0

Evet, birkaç iş parçacığı aynı anda iş parçacığı için güvenli olmayan kod çalıştırdığında ortaya çıkabilir. Genellikle, bu sorunu çözmek için, [QMutex] gibi [senkronizasyon nesneleri] (http://doc.qt.nokia.com/4.7/threads-synchronizing.html) kullanabilirsiniz. Ancak bu durumda, sadece bir iş parçacığı aktif olduğunda statik değişkenin başlatıldığından emin olmanız gerekir, çünkü değiştirilmemesi gerekiyor. – userr1728854

1

std :: haritası oluşturmak ve QMap init için kullanabilirsiniz, ya da sadece std :: harita ile QMap değiştirebilirsiniz: yapıcı

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

başka yolu da init edilir COLUMN_NAMES:

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

ama bu iş parçacığı güvenli değil, ilk yöntem ana önce çağrıldı, ikincisi ise çalışma zamanı sırasında çağrılabilir. Sen başlatılmış haritayı döndüren statik işlevini kullanabilirsiniz

+0

İlk yöntem başlıkta veya kaynak dosyada mı olmalı? –

+0

Sıradan, kaynak dosya. – fghj

24

, Qt 5.2 QMap C++ 11 başlatıcı listeleri için destek eklendi:

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

Ben sadece bu yaklaşım denedim ve aynı zamanda tüm otehr C++ 11 özellikleri çalışır değil .... lambdas vb, aslında uygulandığından emin misiniz? Ben QT5.3.1 hata kullanıyorum: 'QMap :: QMap ()' –

+0

çağrısı için eşleşen bir işlev yok Aslında bunu yalnızca Qt 5.4.0 ile denedim ama [document] (http://doc.qt.io/qt-5/qmap.html#QMap-2), Qt 5.1'den beri mevcut olduğunu söylüyor.C++ 11'i .pro dosyasına 'CONFIG + = C++ 11 'ekleyerek düzgün bir şekilde etkinleştirdiniz mi? – Luchs

+2

Tamlık için: harita başka bir yerde ilan edilmişse, aşağıdaki gibi bir şeyle başlatabilirsiniz: 'this-> m_map = QMap ({{" a ", 1}, {" b ", 2}, {"c", 3}}); ' – waldyrious

3

diğer yaklaşım bir kullanma:

QMap::​QMap(std::initializer_list<std::pair<Key, T> > list) 

Bu böyle haritanızı başlatmak anlamına gelir başlatıcı listesi.

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

Bu, daha önce Qt için çalışıyor, daha önce Qt doğrudan başlatıcı listeleriyle çalışmak üzere düzeltildi.

İlgili konular