2013-08-09 29 views
9

Tôi cần lưu trữ các phiên bản của một lớp tùy chỉnh trong sổ đăng ký qua QSettings. Sau khi đọc từ tài liệu của Qt, tôi nghĩ rằng tôi đã thực hiện các chức năng cần thiết nhưng tôi không quản lý để tiết kiệm bất cứ điều gì.Viết và đọc lớp tùy chỉnh cho QSettings

Đây là lớp học của tôi tùy chỉnh:

class SRSDefinition{ 
public: 
    SRSDefinition(QString name, QString definition) : qsName(name), qsDefinition(definition) 
    { 
     qRegisterMetaType<SRSDefinition>("SRSDefinition"); 
     qRegisterMetaTypeStreamOperators<SRSDefinition>("SRSDefinition");  
    } 
    SRSDefinition(const SRSDefinition& original) : qsName(original.qsName), qsDefinition(original.qsDefinition) {} 
    SRSDefinition() : qsName(""), qsDefinition(""){} 
    ~SRSDefinition(); 
    QString qsName; 
    QString qsDefinition; 
private: 
    friend QDataStream& operator << (QDataStream& out, const SRSDefinition& valeur) {out << valeur.qsName << valeur.qsDefinition; return out; } 
    friend QDataStream& operator >> (QDataStream& in, SRSDefinition& valeur) {in >> valeur.qsName >> valeur.qsDefinition; return in;} 
}; 
Q_DECLARE_METATYPE(SRSDefinition) 
QDataStream& operator << (QDataStream& out, const SRSDefinition& Valeur); 
QDataStream& operator >> (QDataStream& in, SRSDefinition& Valeur); 

tiết kiệm trong registry:

QSettings settings("Organization", "Application"); 
QVariant variant; 
variant.setValue(QVariant::fromValue<SRSDefinition>(m_srsSelected)); 
settings.setValue("Shared/RecentSRS", variant); 

tải từ registry:

QSettings settings("Organization", "Application"); 
m_srsSelected = settings.value("Shared/RecentSRS").value<SRSDefinition>(); 

Một khóa mới trong registry được tạo ra, nhưng nó chứa mã hex mà tôi nghĩ chỉ là tên của lớp ... enter image description here

Bất kỳ ý tưởng nào về cách lưu trữ hiệu quả các giá trị?

Trả lời

15

Sử dụng qRegisterMetaTypeStreamOperators<YourType>("YourType") để bật tuần tự/loại bỏ tuần tự các loại tùy chỉnh có QVariant. Hàm này đăng ký các chức năng đầu vào/đầu ra QDataStream của loại của bạn với hệ thống siêu dữ liệu của Qt để nó có thể gọi chúng khi lưu/tải một biến thể chứa loại tùy chỉnh của bạn.

#include <QtCore/QDebug> 
#include <QtCore/QDataStream> 
#include <QtCore/QSettings> 

struct CustomType { 
    QString name; 
    int age; 
}; 

Q_DECLARE_METATYPE(CustomType); 

QDataStream& operator<<(QDataStream& out, const CustomType& v) { 
    out << v.name << v.age; 
    return out; 
} 

QDataStream& operator>>(QDataStream& in, CustomType& v) { 
    in >> v.name; 
    in >> v.age; 
    return in; 
} 

int main(int,char**) { 

    qRegisterMetaTypeStreamOperators<CustomType>("CustomType"); 

    { 
     CustomType t; 
     t.name = "John Smith"; 
     t.age = 42; 
     QSettings s("config.ini", QSettings::IniFormat); 
     s.setValue("user", QVariant::fromValue(t)); 
    } 

    { 
     QSettings s("config.ini", QSettings::IniFormat); 
     QVariant value = s.value("user"); 
     CustomType t = value.value<CustomType>(); 

     qDebug() << t.name << t.age; 
    } 


    return 0; 
} 
+0

Thật vậy, chỉ cần di chuyển 'qRegisterMetaTypeStreamOperators (" SRSDefinition ");' để giải quyết chính vấn đề của tôi. Cảm ơn rất nhiều !!! – Ote