目录
QFile详解(文件如果不存在则创建、判断文件是否存在、获得文件的各种详细信息、读写文件)
1、QFile文件如果不存在则创建的方法
2、QFileInfo的方法获得文件的各种详细信息
3、QFile读写文件的内容
QTextStream 的简单理解
1、QTextStream类提供了使用QIODevice读写文本的基本功能。
2、除了QTextStream的构造函数,还要常用的一些方法
3、通常有三种方式来读文本文件:
QString类详解
QTextCodec
QDomDocument
一、描述
QDomElement类的使用
关于控件的Left 、Top、Width和Height属性
QFile详解(文件如果不存在则创建、判断文件是否存在、获得文件的各种详细信息、读写文件)
1、QFile文件如果不存在则创建的方法
QFile f("./1234.ini");
if(!f.open(QIODevice::Append))
{
return 0;
}
open里的打开模式为QIODevice::WriteOnly、QIODevice::ReadWrite、QIODevice::Append这三种的话,文件不存在则会自动创建出一个空文件出来。其他打开模式就不行。已测试。
open打开的几种模式如下:
QIODevice::ReadOnly 以只读方式打开文件
QIODevice::WriteOnly 只写方式
QIODevice::ReadWrite 读写方式
QIODevice::Append 追加模式打开,新写入文件的数据添加到文件尾部
QIODevice::Truncate 截取方式打开文件,文件原有的内容全部被删除
QIODevice::Text 文本方式打开文件,读取时“\n”被自动翻译为换行符
这些取值可以用“|”组合使用,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式打开文件。
2、QFileInfo的方法获得文件的各种详细信息
补充:
3、QFile读写文件的内容
QFile file("./test.xml");
if(!file.open(QIODevice::ReadWrite))
{
return 0;//打开文件失败
}
//读取文件的所有内容
QByteArray array1 = file.readAll();
qDebug() << array1;
//按行读取
while(!file.atEnd())
{
//方式1
QByteArray array2 = file.readLine();
qDebug() << array2;
//方式2
char buf[1024];
qint64 lineLength = file.readLine(buf, sizeof(buf));
if (lineLength != -1)
{
// the line is available in buf
qDebug() << "行" << buf;
}
//方式三,读取速度相对于上面的会快一点
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
}
}
/****写入文件****/
//方式1
QByteArray ba1 = "1236546";
file.write(ba1);//叠加调用并不会换行
//方式2
QTextStream aStream(&file); //用文本流读取文件
QString str="xsx";//叠加调用并不会换行
aStream<< endl << str; //写入文本流,在字符的前面会换行
str ="fefre";
aStream<< str << endl; //endl起到换行的作用,在字符后面有换行
file.close();
注:有的写入要达到换行的效果时,open的时候要加入QIODevice::Text这种模式.
QTextStream 的简单理解
1、QTextStream类提供了使用QIODevice读写文本的基本功能。
QTextStream可以操作QIODevice上,支持QByteArray和QString。如果使用QTextStream的operators,可以方便的读写words,lines 和numbers. 对一般的文本,QTextStream支持格式化对齐,格式化数字 等。例如
QFile data(“output.txt”);
if (data.open(QFile::WriteOnly | QFile::Truncate))
{
QTextStream out(&data);
out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
// writes "Result: 3.14 2.7 "
}
2、除了QTextStream的构造函数,还要常用的一些方法
例如:
setDevice() : 设置设备
setString(): 设置字符串
seek():查找位置
atEnd():返回是否还有数据可读
flush():清空写缓存区
QTextStream 使用的是Unicode 缓存,Qt中的QTextCodec类 可以支持各种字符集。
3、通常有三种方式来读文本文件:
chunk By chunk(块读):readLine()和readAll()
Word By Word(按字读):
character By character(按字节读):
QString类详解
1 常用构造函数
QString s1 = “Hello”;
QString s2(“world”);
QString s3 = s1;
//使用数组, QChar的大小是两个字节
QChar arr[] = {‘L’, ‘o’, ‘v’, ‘e’};
QString s4(arr, 4);
每个对象打印出来的结果如下:
2 字符串与数值之间的转换
3 添加字符串
4 大小写转换
5 长度
6 其他常用函数
判断空字符串的区别:
若字符串为"123,aaa,999,ppp",当调用s,section(",", 0, 3)函数后:
QTextCodec
1.描述
Qt 使用 Unicode 来存储、绘制、操作字符串。 在许多情况下,可能希望处理使用不同编码的数据。
Qt 提供了 QTextCodec 类来帮助在非 Unicode 格式和 Unicode 之间进行转换。
QTextCodecs 可以用于将一些本地编码的字符串转换为 Unicode:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
将字符串从 Unicode 转换为本地编码:
QString string = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedString = codec->fromUnicode(string);
尝试以块的形式转换数据时必须小心,例如,当通过网络接收数据时,多字节字符可能会被分成两个块。这可能会导致字符丢失,最坏的情况是导致整个转换失败。在这些情况下使用的方法是为编解码器创建一个 QTextDecoder 对象,并使用这个 QTextDecoder 进行整个解码过程,如下所示:
QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
QTextDecoder *decoder = codec->makeDecoder();
QString string;
while (new_data_available())
{
QByteArray chunk = get_new_data();
string += decoder->toUnicode(chunk);
}
delete decoder;
QTextDecoder 对象维护块之间的状态,因此即使多字节字符在块之间拆分也能正常工作。
QDomDocument
一、描述
QDomDocument 类表示整个 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的主要访问。
由于元素、文本节点、注释、处理指令等不能存在于文档的上下文之外,因此文档类还包含创建这些对象所需的工厂函数。创建的节点对象有一个 ownerDocument() 函数,该函数将它们与创建它们的上下文中的文档相关联。
解析的 XML 在内部由对象树表示,可以使用各种 QDom 类访问这些对象树。所有 QDom 类只引用内部树中的对象。一旦最后一个引用它们的 QDom 对象或 QDomDocument 本身被删除,DOM 树中的内部对象将被删除。
元素、文本节点等的创建是使用此类中提供的各种工厂函数完成的。使用 QDom 类的默认构造函数只会导致无法操作或插入文档的空对象。
注意:如果 XML 文档很大,DOM 树最终可能会消耗大量内存。对于此类文档,QXmlStreamReader 类可能是更好的解决方案。
QDom 类通常如下使用:
QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open(QIODevice::ReadOnly))
return;
if (!doc.setContent(&file))
{
file.close();
return;
}
file.close();
QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement();
if(!e.isNull())
{
cout << qPrintable(e.tagName()) << '\n';
}
n = n.nextSibling();
}
QDomElement elem = doc.createElement("img");
elem.setAttribute("src", "myimage.png");
docElem.appendChild(elem);
要使用 DOM 创建文档,请使用如下代码:
QDomDocument doc("mydocument");
QDomElement root = doc.createElement("MyML");
doc.appendChild(root);
QDomElement tag = doc.createElement("Greeting");
root.appendChild(tag);
QDomText t = doc.createTextNode("Hello World");
tag.appendChild(t);
// QString xml = doc.toString();
QFile file("demo.xml");
file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();
QDomElement类的使用
QDomElement类表示DOM树中的一个元素。
元素具有tagName ()以及与之关联的零个或多个属性。可以使用setTagName ()更改标签名称。
元素属性由QDomAttr对象表示,可以使用attrbute ()和attributeNode ()函数进行查询。您可以使用setAtribute ()和setAttributeNode ()函数设置属性。可以使用removeAttribute ()删除属性。这些函数有名称空间感知的等效项,即setAttributeNS ) , setAttributeNodeNS ()和removeAttributeNS ()。
如果您要访问节点的文本,请使用text (),例如
QDomElement e = //...
//...
Qstring s = e.text ( )
关于控件的Left 、Top、Width和Height属性
其中窗体的四个属性值,left 、top、width、和Height属性区别。
对于left和top是指该控件或是该窗体的左顶点。而width和height是右下顶点。