Qt诺基亚官方中文教程L3-Qt的数据类型机会及_第1页
Qt诺基亚官方中文教程L3-Qt的数据类型机会及_第2页
Qt诺基亚官方中文教程L3-Qt的数据类型机会及_第3页
Qt诺基亚官方中文教程L3-Qt的数据类型机会及_第4页
Qt诺基亚官方中文教程L3-Qt的数据类型机会及_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.数据类型集合和文件QtinEducationQt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第1页!ThisworkisaChinesetranslationoftheoriginalQtEducationalTrainingMaterialspublishedbyNokia:©2010NokiaCorporationanditsSubsidiary(-ies).Nokia,QtandtheNokiaandQtlogosaretheregisteredtrademarksofNokiaCorporationinFinlandandothercountriesworldwide.ThistranslationwascreatedbyCommunicationandComputerNetworkLaboratoryofGuangdongProvince,SouthChinaUniversityofTechnology.©2010CommunicationandComputerNetworkLaboratoryofGuangdongProvince,SouthChinaUniversityofTechnology.TheenclosedQtEducationalTrainingMaterialsareprovidedundertheCreativeCommonsAttribution-Non-Commercial-ShareAlike2.5LicenseAgreement.Thefulllicensetextisavailablehere:/licenses/by-nc-sa/2.5/legalcode.

此文档内容是由诺基亚公司发布的原创Qt教育培训文档的中文翻译:©2010诺基亚公司及其附属公司。Nokia(诺基亚),Qt以及Nokia与Qt商标是Nokia公司在芬兰和全球其他国家的注册商标。

该翻译版本由华南理工大学广东省计算机网络重点实验室创造。©2010华南理工大学广东省计算机网络重点实验室

本Qt教育培训材料依照署名-非商业性使用-相同方式共享2.5许可协议(CreativeCommons

Attribution-Non-Commercial-ShareAlike2.5LicenseAgreement)发布。

完整的许可证文本可以在这里找到:/licenses/by-nc-sa/2.5/legalcode。

Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第2页!管理文本简单的C字符串是方便的,但这仅限于本地字符编码QString类试图成为现代的字符串类Unicode和codecs隐式共享的性能char*text="Helloworld!";Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第3页!QString支持存储Unicode字符串,几乎当前在用的所有书写系统都能表示支持从不同的本地编码转换或者转成不同的本地编码提供了一个方便的字符串检查和修改的APIQString::toAscii–QString::toLatin1–QString::toLocal8BitQt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第4页!QStringBuilder使用+运算符来连接字符串,这需要多次内存分配和字符串长度检查一个更好的方式是包含QStringBuilder并使用%操作符该字符串生成器在连接之前一次性收集所有字符串的长度,只需执行一次内存分配QStringres="Hello“%name%“,thevalueis%"%QString::number(42);QStringtemp="Hello“;temp=temp%name;temp=temp%“,thevalueis%"temp=temp%QString::number(42);分成多个小步骤连接字符串会降低性能Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第5页!子串使用left,right和mid访问子串如果mid不指定长度,则返回字符串的剩余部分用

replace查找和替代字符串QStrings="Helloworld!";r=s.left(5);//"Hello"r=s.right(1);//"!"r=s.mid(6,5);//"world"r=s.mid(6);//"world!"r=s.replace("world","universe");//"Hellouniverse!"Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第6页!与数字间转换把数字转换为字符串把字符串转换为数值QString::number(intvalue,intbase=10);QStringtwelve=QString::number(12);//"12"QStringoneTwo=QString::number(0x12,16);//"12"QString::number(doublevalue,charformat='g',intprecision=6);QStringpiAuto=QString::number(M_PI);//"3.14159"QStringpiScientific=QString::number(M_PI,'e');//"3.141593e+00"QStringpiFixedDecimal=QString::number(M_PI,'f',2);//"3.14"boolok;QStringi="12";intvalue=i.toInt(&ok);if(ok){//Convertedok}boolok;QStringd="12.36e-2";doublevalue=d.toDouble(&ok);if(ok){//Convertedok}不能处理千分位Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第7页!Empty字符串和null字符串一个QString可以为null,即什么也没有包含它也可是empty,即包含一个空字符串QStringe="";e.isNull();//falsee.isEmpty();//trueQStringn=QString();n.isNull();//truen.isEmpty();//true相对于一个empty字符串来说,传递没有字符的串是非常有用的,

见QInputDialog::gettext

–当取消时返回一个null字符串Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第8页!QStringListQStringList是一个专门列表类型为存储字符串而设计

提供了一个方便的作用于列表中字符串的API这个类使用隐含共享副本修改作为const引用传递的代价低Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第9页!排序与筛选QStringList可以进行排序......筛选......及清除重复的条目qDebug()<<capitals;//("Stockholm","Oslo","Helsinki","Copenhagen")

capitals.sort();qDebug()<<capitals;//("Copenhagen","Helsinki","Oslo","Stockholm")QStringListcapitalsWithO=capitals.filter("o");qDebug()<<capitalsWithO;//("Copenhagen","Oslo","Stockholm")

capitals<<capitalsWithO;qDebug()<<capitals;//("Copenhagen","Helsinki","Oslo","Stockholm",//"Copenhagen","Oslo","Stockholm")

capitals.removeDuplicates();qDebug()<<capitals;//("Copenhagen","Helsinki","Oslo","Stockholm")默认区分大小写Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第10页!Qt的集合QStringList接口不是唯一的字符串列表。QStringList是由QList<QString>派生的。QList是众多Qt容器模板类中的一个QLinkedList-在中间快速插入,通过迭代器QVector-使用连续内存,缓慢插入QStack–LIFO,后进先出QQueue–FIFO,先进先出QSet–唯一值QMap–关联数组QHash–关联数组,比QMap快,但需要哈希QMultiMap–通过每个键的多个值关联数组QMultiHash–通过每个键的多个值关联数组关联到Qlist的快慢将是我们的参考和标准Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第11页!删除使用removeFirst,removeAt,removeLast从Qlist中删除列表项用takeFirst,takeAt,takeLast去得到一个列表项使用removeAll或removeOne删除特定值的列表项while(list.length())list.removeFirst();QList<QWidget*>widgets;widgets<<newQWidget<<newQWidget;while(widgets.length())deletewidgets.takeFirst();QList<int>list;list<<1<<2<<3<<1<<2<<3;list.removeAll(2);//Leaves1,3,1,3Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第12页!迭代-Java风格Qt支持Java风格迭代器Java风格的迭代器指向条目之间toFront把迭代器置于项前面toBack把迭代器置于最后一项后面用peekNext和peekPrevious参考列表项用

next

previous指向列表项item1item5item4item3item2i.toBack()i.toFront()i.peekNext()i.next()i.peekPrevious()i.previous()iQListIterator<int>iter(list);while(iter.hasNext())qDebug("Item:%d",iter.next());如果需要修改列表项,使用QMutableListIterator均返回一个值并迈向列表的下一个位置Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第13页!懒惰式的迭代遍历整个集合,使用foreach警告!当按值返回时要确保复制列表QStringListtexts;foreach(QStringtext,texts)doSomething(text);QStringListtexts;foreach(constQString&text,texts)doSomething(text);constQList<int>sizes=splitter->sizes();QList<int>::const_iteratori;for(i=sizes.begin();i!=sizes.end();++i)processSize(*i);由于隐性共享,复制代价低廉使用常量的引用有助于提高性能。不使用它,仍然无法让你改变列表的内容Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第14页!其他集合谁能代替QList,它们跟QList有何区别?QLinkedList用索引访问缓慢使用迭代器很快快速(恒定时间)在列表的中间插入QVector使用连续的内存空间插入和置首缓慢Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第15页!特殊情况-QStack堆,一个后进先出(LIFO)的容器

后进先出列表项压入堆列表项弹出堆用top()取出顶项s.push()s.pop()QStack<int>stack;stack.push(1);stack.push(2);stack.push(3);qDebug("Top:%d",stack.top());//3qDebug("Pop:%d",stack.pop());//3qDebug("Pop:%d",stack.pop());//2qDebug("Pop:%d",stack.pop());//1qDebug("isEmpty?%s",stack.isEmpty()?"yes":"no");Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第16页!特殊情况-QSet一个集合包含值,但对每个值只有一个实例。可以判断一个值是否是集合的一部分也可以遍历一个集合,看到所有的值可以转换一个QList

到一个QSetQSet<int>primes;primes<<2<<3<<5<<7<<11<<13;for(inti=1;i<=10;++i)qDebug("%dis%sprime",i,primes.contains(i)?"":"not");foreach(intprime,primes)qDebug("Prime:%d",prime);QList<int>list;list<<1<<1<<2<<2<<2<<3<<3<<5;QSet<int>set=list.toSet();qDebug()<<list;//(1,1,2,2,2,3,3,5)qDebug()<<set;//(1,2,3,5)Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第17页!使用QMap

QMap

类需要操作符<

来定义关键类型此操作符用来保持键的顺序填充使用运算符[]或

insert来完成对于读取,用value

结合containsif(map.contains("Oslo"))qDebug("Oslo:%d",map.value("Oslo"));qDebug("Berlin:%d",map.value("Berlin",42));map["Stockholm"]=2011047;map.insert("London",13945000);可选默认值。如果没有指定一个默认值将返回构造值用value而不是

[]

以避免误增加项Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第18页!使用QHash键类型必须提供一个qHash

函数和操作符==

到QHash相对Qmap,填充和读取相同uintqHash(constPerson&p){returnp.age()+qHash(());}booloperator==(constPerson&first,constPerson&second){return((()==())&&(first.age()==second.age()));}哈希函数应该根据已知的启发式优化Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第19页!休息Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第20页!

跨平台类型TypeSizeMinimumvalueMaximumvalueuint81byte0255uint162bytes065535uint324bytes04294967295uint648bytes018446744073709551615int81byte-128127int162bytes-3276832767int324bytes-21474836482147483647int648bytes-92233720368547758089223372036854775807quintptr“pointersized”n/an/aqptrdiff“pointersized”n/an/aqrealfastrealvaluesn/an/a所有类型都定义在头<QtGlobal>中Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第21页!QVariant有时候,希望能够通过一个普通的接口返回任何类型QVariant类可以被视为一个联合创造一个Qt的类型联合是不可能,因为联合需要默认的构造函数变异类可以包含自定义的复杂类型,例如QColor属于QtGui,QVariant属于QtCore——一旦它们被声明,联合就不能扩展到更多类型constQVariant&data(intindex);voidsetData(constQVariant&data,intindex);数据可以是一个字符串,

图片,颜色,画刷

一个整数值,等Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第22页!自定义的复杂类型我们实现一个小类,包含一个人的名字和年龄classPerson{public:Person();Person(constPerson&);Person(constQString&,int);constQString&name()const;intage()const;voidsetName(constQString&);voidsetAge(int);boolisValid()const;private:QStringm_name;intm_age;};Person::Person():m_age(-1){}...voidPerson::setAge(inta){m_age=a;}boolPerson::isValid()const{return(m_age>=0);}不必是一个QObject.Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第23页!QVariant与Person对象当类型注册成为一个元类型,Qt能把它存储在一个Qvariant中要求声明类型PublicdefaultconstructorPubliccopyconstructorPublicdestructorQVariantvar;var.setValue(Person("Ole",42));Personp=var.value<Person>();qDebug("%s,%d",qPrintable(()),p.age());Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第24页!注册类型错误信息告诉我们如何解决问题qRegisterMetaType函数必须在连接建立之前被调用(通常从main开始)intmain(intargc,char**argv){qRegisterMetaType<Person>();...Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第25页!路径用QDir

类去处理路径学会用静态函数去初始化QDird=QDir::root();//C:/onwindowsQDir::current()//CurrentdirectoryQDir::home()//HomedirectoryQDir::temp()//Temporarydirectory//ExecutabledirectorypathQDir(QApplication::applicationDirPath())QDird=QDir("C:\\");Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第26页!找目录内容QDir::NameQDir::TimeQDir::SizeQDir::TypeQDir::DirsFirstQDir::DirsLastQDir::ReversedQFileInfoListinfos=QDir::root().entryInfoList(QDir::Dirs,QDir::Name);foreach(constQFileInfo&info,infos)qDebug("%s",qPrintable(info.fileName()));过滤器顺序排序方法...目录在文件的前面还是后面倒序你也可以指定排序顺序从主目录根据名字排列所有目录Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第27页!QFileInfo每个

QFileInfo

对象都有许多函数absoluteFilePath–某项的完整路径isDir/isFile/isRoot–项的类型isWriteable/isReadable/isExecutable–文件的权限/home/john/the-archive.tar.gzfileNameabsolutePathpathbaseNamepleteSuffixsuffix当遍历时,有利于建立新的Qdir对象Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第28页!写文件QFilef("/home/john/input.txt");

if(!f.open(QIODevice::WriteOnly))qFatal("Couldnotopenfile");QByteArraydata=createData();f.write(data);

f.close();写入文件时,用WriteOnly

模式打开文件,用写函数向文件添加数据文件也可用ReadWrite

模式打开Append或Truncate标志可以与写入模式相结合以追加数据到文件或截断它(即清除文件以前的内容)if(!f.open(QIODevice::WriteOnly|QIODevice::Append))Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第29页!流操作与文件读取和写入函数在许多情况下显得尴尬–如处理复杂类型等一个现代的方案是使用流操作Qt的提供两种流操作用于处理文本文件用于处理二进制文件格式Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第30页!Resultsin:

写入文本流使用操作符

<<

和修饰符,跟使用STL的流类似QFilef(...);if(!f.open(QIODevice::WriteOnly))qFatal("Couldnotopenfile");QTextStreamout(&f);out<<"Primes:"<<qSetFieldWidth(3)<<2<<3<<5<<7<<endl;Primes:2357数字可以直接放到流中向流添加一个换行符修饰符,设置字段最小宽度Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第31页!处理二进制文件

QDataStream类用于字节流保证字节顺序(默认大端)支持基本类型支持Qt的复杂类型支持添加自定义的复杂类型if(!f.open(QIODevice::WriteOnly))qFatal("Couldnotopenfile");QDataStreamds(&f);ds<<QString("Unicodestringdata");简单地传递一个指向QFile对象的指针流到流构造函数去为指定的文件设置一个流Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第32页!数据流作为一种文件格式QFilef("file.fmt");if(!f.open(QIODevice::WriteOnly))qFatal("Couldnotopenfile");QDataStreamout(&f);out.setVersion(QDataStream::Qt_4_6);quint32value=...;QStringtext=...;QColorcolor=...;out<<value;out<<text;out<<color;QFilef("file.fmt");if(!f.open(QIODevice::ReadOnly))qFatal("Couldnotopenfile");QDataStreamin(&f);in.setVersion(QDataStream::Qt_4_6);quint32value=...;QStringtext=...;QColorcolor=...;in>>value;in>>text;in>>color;这里支持低到Qt1.0的版本。如果希望序列化混合类型而又没有指明类型次序的对象,可以序列化QVariant对象。进行流读写时要确保类型和顺序匹配Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第33页!流化自定义类型为了流化包含在QVariant对象中的自定义类型,流操作符必须注册当变量被流化后,它增加了数据类型的名称,以确保它之后可以从流中恢复qRegisterMetaTypeStreamOperators<Person>("Person");00:0x000x000x000x7f0x000x000x000x00________08:0x070x500x650x720x730x6f0x6e0x00_Person_16:0x000x000x000x060x000x4f0x000x6c_____O_l24:0x000x650x000x000x000x2ae___*Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第34页!建立字符串有三种建立字符串的主要方法运算符‘+’

方法QStringBuilder

的方法arg

方法QStringres=QString("Hello%1,thevalueis%2").arg(name).arg(42);QStringres="Hello“+name+“,thevalueis"+QString::number(42);QStringres="Hello“%name%“,thevalueis"%QString::number(42);Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第35页!QString::argarg方法用值来替换

%1-99

可以处理字符串,字符,整型和浮点型能在数字基数之间转换"%1+%2=%3,thesumis%3"...).arg(value,width,base,fillChar);...).arg(42,3,16,QChar('0'));//Resultsin02a...).arg(QString,...QString)...).arg(inta)...).arg(uinta)...).arg(longa)...).arg(ulonga)...).arg(qlonglonga)...).arg(qulonglonga)...).arg(shorta)...).arg(ushorta)...).arg(QChara)...).arg(chara)...).arg(doublea)%n的所有实例都被替换每次上限为9个参数Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第36页!打印到控制台Qt是一个主要用于可视应用的工具包,即不专注于命令行界面的要打印,用

qDebug

函数它总是可用,但是在建立发布版本时会静默像printf

函数那样工作(但加上“\n”)使用qPrintable宏很容易打印QString的文本当包含QtDebug后,能与流操作符一起使用qDebug("Integervalue:%d",42);qDebug("Stringvalue:%s",qPrintable(myQString));#include<QtDebug>qDebug()<<"Integervalue:"<<42;qDebug()<<"Stringvalue:"<<myQString;qDebug()<<"Complexvalue:"<<myQColor;Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第37页!与std::(w)string一起工作当连接第三方库和其他代码时,与标准库的字符串转换很方便从标准库的字串转换成其他

转成标准库字符串QStringqs="Helloworld!";std::stringss=qs.toStdString();std::wstringsws=qs.toStdWString();std::stringss="Helloworld!";std::wstringsws="Helloworld!";QStringqss=QString::fromStdString(ss);QStringqsws=QString::fromStdWString(sws);假定为ASCIIQt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第38页!分割和组合一个QString

能够被分割成子串由此产生的对象是QstringList,它可被组合成一个QStringQStringwhole="Stockholm-Copenhagen-Oslo-Helsinki";QStringListparts=whole.split("-");QStringwholeAgain=parts.join(",");//Resultsin"Stockholm,Copenhagen,Oslo,Helsinki"Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第39页!建立和修改字符串列表用<<

操作符把字符串增加到字符串列表replaceInStrings函数能让你在QStringList的所有字符串中进行搜索和替换。QStringListverbs;verbs="running"<<"walking"<<"piling"<<"linking";qDebug()<<verbs;//("running","walking","piling","linking")verbs.replaceInStrings("ing","er");qDebug()<<verbs;//("runner","walker","piler","linker")

Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第40页!遍历字符串使用操作符

[]

length

函数,你可以遍历QStringList的内容另一种方法是使用at()

函数,它提供列表项的只读访问你也可以使用foreach

宏QStringListcapitals;for(inti=0;i<capitals.length();++i)qDebug()<<capitals[i];QStringListcapitals;foreach(constQString&city,capitals)qDebug()<<city;Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第41页!填充你可以用操作符<<填充一个QList函数prepend,insert

和append

也可以使用QList<int>fibonacci;fibonacci<<0<<1<<1<<2<<3<<5<<8;list.append(4);QList<int>list;list.append(2);list.prepend(1);list.insert(1,3);index0:2index0:2index1:4index0:1index1:2index2:3index0:2index1:3index2:4index3:4Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第42页!访问一个QList

的索引范围是0-(length-1)单个列表项可以用at

或者[]

操作符来访问。如果你能接受超出界限的情况,可以用value。[]运算符返回一个可修改的引用for(inti=0;i<list.length();++i)list[i]++;for(inti=0;i<list.length();++i)qDebug("At:%d,[]:%d",list.at(i),list[i]);for(inti=0;i<100;++i)qDebug(“Value:%d”,list.value(i));当索引超出范围时返回默认构造值Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第43页!

迭代-STL的风格Qt支持STL风格的迭代器STL的迭代器指向每个列表项,并以此作为结束标记无效项项用begin来返回结束标志用end返回*

操作符关联项的值

当你向后遍历访问之前,必须移动操作符item1item5item4item3item2begin()iend()end()*ifor(QList<int>::ConstIteratoriter=list.begin();iter!=list.end();++iter)qDebug("Item:%d",*iter);如果你需要修改列表项,使用迭代器STL和Qt两者的命名可以使用。Iterator|iterator和ConstIterator|const_iteratorQt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第44页!与STL的交互QList

能与相应的std::list相互转换与STL的相互转换意味着对列表内容进行深度复制–不存在隐含共享QList<int>list;list<<0<<1<<1<<2<<3<<5<<8<<13;std::list<int>stlList=list.toStdList();QList<int>otherList=QList<int>::fromStdList(stlList);从Qt列表到STL列表从STL列表到Qt列表Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第45页!其他集合注意,摊销行为(amortizedbehavior)是指在实时环境中不可预知的次数其他集合是以Qlist为基础的QStringListQStackQQueueQSetCollectionIndexaccessInsertPrependAppendQListO(1)O(n)Amort.O(1)Amort.O(1)QLinkedListO(n)O(1)O(1)O(1)QVectorO(1)O(n)O(n)Amort.O(1)Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第46页!特殊情况-QQueue队列,一个先进先出(FIFO)的容器

先进先出项排队进入队列项从队列中出列取项可以用head()s.enqueue()s.dequeue()QQueue<int>queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);qDebug("Head:%d",queue.head());//1qDebug("Pop:%d",queue.dequeue());//1qDebug("Pop:%d",queue.dequeue());//2qDebug("Pop:%d",queue.dequeue());//3qDebug("isEmpty?%s",queue.isEmpty()?"yes":"no");Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第47页!键-值集合QMap和QHash类让你创建关联数组QHash<QString,int>hash;hash["Helsinki"]=1310755;hash["Oslo"]=1403268;hash["Copenhagen"]=1892233;hash["Stockholm"]=2011047;foreach(constQString&key,hash.keys())qDebug("%s",qPrintable(key));QMap<QString,int>map;map["Helsinki"]=1310755;map["Oslo"]=1403268;map["Copenhagen"]=1892233;map["Stockholm"]=2011047;foreach(constQString&key,map.keys())qDebug("%s",qPrintable(key));if(map.contains("Oslo")){qDebug("Oslo:%d",map.value("Oslo"));}Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第48页!哈希QMap使用了给定的模板中的类型的键QHash

使用

uint

值key类型散列到一个uint值运用uint

值可能提高性能哈希值表示键没有排序哈希函数必须设法避免碰撞,以达到良好的性能Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第49页!一键多值QMultiMap和QMultiHash提供支持一键多值的关联数组QMultiMap<QString,int>multiMap;multiMap.insert("primes",2);multiMap.insert("primes",3);multiMap.insert("primes",5);...multiMap.insert("fibonacci",8);multiMap.insert("fibonacci",13);foreach(constQString&key,multiMap.uniqueKeys()){QList<int>values=multiMap.values(key);QStringListtemp;foreach(intvalue,values)temp<<QString::number(value);qDebug("%s:%s",qPrintable(key),qPrintable(temp.join(",")));}value

返回每个键的最后插入,values

返回键的所有值的列表keys

为每个值重复每个键,使用uniqueKeys一次获取每个键没有

[],用

insertQMap

和QHash

也支持这个使用insertMultiQt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第50页!

Qt的类型定义C++中没有定义严格跨平台类型的大小sizeof(int)=?对于跨平台的代码,以严格的方式定义的所有类型是很重要的ARM=4bytesx86=4bytesIA64=8bytes...取决于

CPU架构,

操作系统,

编译器等Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第51页!Qt的复杂类型Qt提供了多个复杂的类和类型QColorQBrushQRectQPointQStringQSizeQListQImageQByteArrayQPixmapQPenQFontQt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第52页!使用QVariant基本类型用构造函数和

toType

函数处理非QtCore类型,如自定义类型,使用setValue

函数和模板

value<type>

函数来处理QVariantv;QColorc(Qt::red);qDebug()<<"Before:"<<c;//Before:QColor(ARGB1,1,0,0)

v.setValue(c);c=v.value<QColor>();//After:QColor(ARGB1,1,0,0)

qDebug()<<"After:"<<c;QVariantv;inti=42;qDebug()<<"Before:"<<i;//Before:42v=i;i=v.toInt();qDebug()<<"After:"<<i;//After:42Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第53页!QVariant与Person对象试图通过一个QVariant对象传递一个Person对象失败在元类型系统中声明这一类型解决了问题classPerson{...};Q_DECLARE_METATYPE(Person)#endif//PERSON_Hqmetatype.h:200:error:'qt_metatype_id'isnotamemberof'QMetaTypeId<Person>'Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第54页!然后,它中断了...当与信号和槽工作,大部分连接是直接的直接连接时,类型可工作排队的连接,即非阻塞,异步的时候,这些类型不能工作(比如跨越线程边界)connect(src,SIGNAL(),dest,SLOT(),Qt::QueuedConnection);...QObject::connect:Cannotqueueargumentsoftype'Person'(Makesure'Person'isregisteredusingqRegisterMetaType().)运行时的错误信息Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第55页!文件和文件系统在跨平台中的文件和目录带来许多问题系统是否有驱动器,或只是一个根?路径是否被“/”或“\”隔开?系统在哪里存储临时文件?用户在哪里存储文档?应用程序在哪里存储?Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第56页!找目录内容entryInfoList返回该目录内容的信息列表你可以添加过滤器以跳过文件或目录QFientryInfoListleInfoListinfos=QDir::root().entryInfoList();foreach(constQFileInfo&info,infos)qDebug("%s",qPrintable(info.fileName()));QDir::DirsQDir::FilesQDir::NoSymLinksQDir::ReadableQDir::WritableQDir::ExecutableQDir::HiddenQDir::System以任意顺序列出文件和目录隐藏文件?系统文件?哪个文件?目录,文件或

符号链接?Qt诺基亚官方中文教程L3_Qt的数据类型机会及共65页,您现在浏览的是第57

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论