早教吧 育儿知识 作业答案 考试题库 百科 知识分享

qt中QMap的读出问题我利用menu.abk文件保存了qmap键值对,然后打开menu.abk文件,想把文件的内容按照输入的名称查找其对应的内容.可是每次只能从文件中读出一个键值,其他的均不能读出,我的部分

题目详情
qt中QMap的读出问题
我利用menu.abk文件保存了qmap键值对,然后打开menu.abk文件,想把文件的内容按照输入的名称查找其对应的内容.可是每次只能从文件中读出一个键值,其他的均不能读出,我的部分代码如下:
QMap yidiancai;
……
QDir("/usr/hill");
QFile s1("menu.abk");
if(s1.open(IO_ReadOnly))
{
zhuoh=zw->text();
QDataStream in(&s1);
in>>yidiancai;
s1.close();
if(yidiancai.contains(zhuoh))
{
QMap::Iterator i=yidiancai.find(zhuoh);
desk_number->setText(i.key());
zongshu->setText(i.data());
}
请问这是什么原因?是QMap yidiancai中只有一个值,还是读出的时候只读出了一个值,其他的值没读出来?
紫翼魔狼的回答,可能是我没说清楚.我的意思是qmap已经存入了一个文件(比如为menu.abk文件),程序关闭后qmap中的内容已经为空,但是下次打开程序时,我想将文件中的内容重新加载到qmap中,应该怎样做呢?我上面的程序哪些地方出问题了呢?
上面程序的问题出在第三行,应该改为QDir::setCurrent("/usr/hill");
▼优质解答
答案和解析
QMap是一个键和一个值算是一个变量(也是一对pair变量).
直接查找QMap的资料不是很好找,你可以直接看C++的Map,这个资料就很多了,QMap只是封装了一下C++的Map,基本用法都是相同的.
QMap的读入要逐个的输入
可以使用while(!in.atEnd())循环,逐个输入键(Key)和值(value)
也可以用insert函数逐个插入
iterator QMap::insert ( const Key & key, const T & value )
const Key key ( const T & value ) const //取键
const T value ( const Key & key ) const //取值
if(yidiancai.contains(zhuoh))
{
QMap::Iterator i=yidiancai.find(zhuoh);
desk_number->setText(i.key());
zongshu->setText(i.value());//这里,没有data的函数吧?应该是value
}
一个例子,这个是一个通讯录的一部分,用结构体作为QMap的值,姓名作为QMap的键:
struct ContactList//定义同学录结构体
{
QString Phone;//电话
QString Address;//地址
QString Email;//邮箱
QString Info;//简介
QString Qq;//QQ
QString Msn;//MSN
QString Career;//职业
QString Company;//公司
bool operator==(const struct ContactList &contactlist) const//重载==运算符
{
if(Phone.compare(contactlist.Phone)!=0) return false;
if(Address.compare(contactlist.Address)!=0) return false;
if(Email.compare(contactlist.Email)!=0) return false;
if(Info.compare(contactlist.Info)!=0) return false;
else return true;
}
};
QMap contacts;
//这里 是 从文件加载同学录,要一个一个的加载
void AddressBook::loadFromFile()
{
QString fileName=QFileDialog::getOpenFileName(this,
tr("打开通讯录文件"),"",
tr("通讯录文件(*.txl);;所有文件(*)"));
if(fileName.isEmpty())
return;
else
{
contacts.empty();
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(this,tr("无法打开文件"),
file.errorString());
return ;
}
QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_5);
contacts.empty();
while(!in.atEnd())
{
ContactList contactlist;
QString name;

in>>name;
in>>contactlist.Address;
in>>contactlist.Email;
in>>contactlist.Info;
in>>contactlist.Phone;
in>>contactlist.Qq;
in>>contactlist.Msn;
in>>contactlist.Career;
in>>contactlist.Company;
contacts.insert(name,contactlist);
}

if(contacts.isEmpty())
{
QMessageBox::information(this,tr("文件中没有联系人"),
tr("你打开的文件中没有联系人."));
}
else
{
QMap::iterator i=contacts.begin();
ui->nameLine->setText(i.key());
ContactList contactlist;
contactlist=i.value();
ui->addressText->setText(contactlist.Address);
ui->emailLine->setText(contactlist.Email);
ui->phoneLine->setText(contactlist.Phone);
ui->InfoEdit->setText(contactlist.Info);
ui->qqLine->setText(contactlist.Qq);
ui->msnLine->setText(contactlist.Msn);
ui->careerLine->setText(contactlist.Career);
ui->companyLine->setText(contactlist.Company);
}
}
updateInterface(NavigationMode);
}
看了qt中QMap的读出问题我利用...的网友还看了以下:

侧面描写,求救!我们老师让侧面描写一个人物,但我不知道什么是侧面描写,总是觉得有点别扭,谁能给我写  2020-05-14 …

谁能帮我取一个英文名我的中文名字叫余柔娴,现在有一个英文名叫Catherine.可是我觉得这个名字  2020-05-16 …

在线语文高手来~~作文开头结尾请教!我想1.将春天于义卖活动联系在一起请问给怎么衔接(可以只告诉我  2020-06-04 …

如何才能写出一篇符合外国人习惯的地道英语学术类文章呢?一般我们写的文章包括口语都有浓厚的"qingl  2020-11-04 …

中华民族既为人类文化的发展做出了突出贡献,又有吸纳世界文化精华的魄力.以下最能表明中国人学习外国文化  2020-11-05 …

文章开头,是不是只指第一自然段?第二段算不算文章的开头?第二段算不算文章的开头?不是标题.做阅读题中  2020-11-11 …

英语翻译《楚辞》是中国浪漫主义文学的开端.因其产生的独特的时代背景和文化渊源,及开创者屈原曲折的人生  2020-12-12 …

本人需要一篇文章的开头,叫成长的烦恼,我只要漂亮的开头和结尾。我是一名初中生,需要开头和结尾都是10  2020-12-14 …

中华民族既为人类文化的发展做出了突出贡献,又有吸纳世界文化精华的魄力。以下最能表明中国人学习外国文化  2020-12-24 …

5个好的文章的开头配上结尾5个作文好的开头配结尾(开头和结尾是匹配的)开头和结尾要首尾呼应!就像一篇  2021-01-01 …