QSettings封装的问题

圣诞老人123 2011-07-05 05:17:12
使用QSettings 保存数据到ini
我想通过一个类来包装代理 QSettings类

#ifndef CONFIGMANAGER_H
#define CONFIGMANAGER_H
#include <QVariant>
#include <QSettings>
#include "qmetatype.h"

#define REGIST_CLS_TYPE(type) qRegisterMetaTypeStreamOperators<##type##>();

class ConfigManager
{
public:
ConfigManager(const QString& path);
~ConfigManager();
public:
void initConfig();
QString getFilePath();
void setFilePath(const QString& path);
QVariant getValue(const QString& key);
void setValue(const QString& key, const QVariant& value);
void start(const QString& path);
void stop();
//void registClsType(const QString& type);
private:
QString filePath;
QSettings* settings;
};

#endif // CONFIGMANAGER_H


#include "configmanager.h"



ConfigManager::ConfigManager(const QString& path)
{
start(path);
}
ConfigManager::~ConfigManager()
{
stop();
}

void ConfigManager::initConfig()
{
if(NULL == settings)
settings = new QSettings(filePath,QSettings::IniFormat,0);
}

QString ConfigManager::getFilePath()
{
return filePath;
}

void ConfigManager::setFilePath(const QString &path)
{
filePath = path;
}

QVariant ConfigManager::getValue(const QString &key)
{
if(NULL == settings)
return NULL;
return settings->value(key);
}

void ConfigManager::setValue(const QString &key, const QVariant &value)
{
if(NULL == settings)
return;
settings->setValue(key,value);
}

void ConfigManager::start(const QString& path)
{
filePath = path;
initConfig();
}

void ConfigManager::stop()
{
if(NULL != settings)
delete settings;
}

/*void ConfigManager::registClsType(const QString &type)
{
REGIST_CLS_TYPE(type);

}*/



------------------------------------------------------------------------------------------------

Player obj;
TopItem item00;
item00.name = "kaixin00000000";
item00.type = 3000;
obj.firstName = "AK";
obj.lastName = "47";
obj.number = 80;
obj.item = item00;

ConfigManager manager("D:\\TEST.ini");
qRegisterMetaTypeStreamOperators<Player>();
qRegisterMetaTypeStreamOperators<TopItem>();
//REGIST_CLS_TYPE(Player); #define REGIST_CLS_TYPE(type) qRegisterMetaTypeStreamOperators<##type##>();
//REGIST_CLS_TYPE(TopItem);这个宏有问题 好像是那个<> 我该怎么改
manager.setValue("aaa",obj);//这句有问题在调用中obj的值为什么传不过去 费解



class Player
{
public:
int number;
QString firstName;
QString lastName;
TopItem item;

Player(){

}
Player(const Player& play)
{
number = play.number;
firstName = play.firstName;
lastName = play.lastName;
item = play.item;
}

operator QVariant() const
{
return QVariant::fromValue(*this);
}
};
Q_DECLARE_METATYPE(Player);


class TopItem
{
public:
TopItem();
TopItem(const TopItem& item);
operator QVariant() const;
public:
QString name;
int type;
};
Q_DECLARE_METATYPE(TopItem);

QDataStream& operator<<(QDataStream& out, const TopItem& item);
QDataStream& operator>>(QDataStream& in, TopItem& item);
#endif // TOPITEM_H



求大侠相助啊~~~~~
...全文
175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
p89787259 2011-07-06
  • 打赏
  • 举报
回复
楼主 把你的代码发我份吧 俺也试着调下 89787259@qq.com 谢谢
开始领悟 2011-07-05
  • 打赏
  • 举报
回复
楼主改用指针试试
开始领悟 2011-07-05
  • 打赏
  • 举报
回复
QVariant类型不兼容Player
圣诞老人123 2011-07-05
  • 打赏
  • 举报
回复
东西发你了
bx_wang 2011-07-05
  • 打赏
  • 举报
回复
方便的话,把代码发给我吧。bx_wang@yeah.net。
我也很想知道 是为什么。 (*^__^*) 嘻嘻……
圣诞老人123 2011-07-05
  • 打赏
  • 举报
回复
qRegisterMetaTypeStreamOperators<Player>();
qRegisterMetaTypeStreamOperators<TopItem>();也没错啊 可以取出来的
圣诞老人123 2011-07-05
  • 打赏
  • 举报
回复
而且每次调用manager的时候到settings->putValue 或get的时候都会跳出底层因为操作系统的信号而停止
好像没法访问这个指针似的

我把setting不封装放在外面调用就没啥问题
QSettings* settings = new QSettings("D:\\TEST.ini",QSettings::IniFormat,0);
settings->setValue("tom","cat");

Player obj;
TopItem item00;
item00.name = "kaixin00000000";
item00.type = 3000;
obj.firstName = "AK";
obj.lastName = "47";
obj.number = 80;
obj.item = item00;


settings->setValue("aaa",obj);

TopItem item;
item.name = "kaixin";
item.type = 3;

settings->setValue("bbb",item);
delete settings;*/

我想封装起来
settings->setValue("aaa",obj);第二个参数也是const QVariant& value
我就多封装了一层
bx_wang 2011-07-05
  • 打赏
  • 举报
回复
qRegisterMetaType<type>("type");
bx_wang 2011-07-05
  • 打赏
  • 举报
回复
void setValue(const QString& key, const QVariant& value);
value的类型是 QVariant的啊

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧