1 操纵算子
QTextStream的格式化输出:
#include <QTextStream>
int main(int argc, char *argv[])
{
QTextStream out(stdout);
int i = 60;
out.setIntegerBase(16); // 设置16进制显示,所以使用输入输出流,也可以很容易的进行进制转换
out << i << endl; // output:3c
return 0;
}
但是,如果我想输出一个数字表格,每列分别以十进制,二进制,八进制,十六进制进行显示,那么,用上一篇的方法,可以这样写
#include <QTextStream>
int main()
{
QTextStream out(stdout);
out.setNumberFlags(QTextStream::ShowBase);
out.setFieldWidth(10);
out << "dec"
<< "bin"
<< "oct"
<< "hex" << endl;
QList<int> intList;
intList << 12 << 16 << 18;
for (int i = 0; i < intList.size(); ++i)
{
int num = intList.at(i);
out.setIntegerBase(10);
out << num;
out.setIntegerBase(2);
out << num;
out.setIntegerBase(8);
out << num;
out.setIntegerBase(16);
out << num << endl;
}
/* 输出:
dec bin oct hex
12 0b1100 014 0xc
16 0b10000 020 0x10
18 0b10010 022 0x12
*/
}
在for循环中,每次输出一种进制,就需要重新设置输出标志,这显得很不灵活。为了解决这样的问题,可以使用操纵算子,Qt中的操纵算子和标准库中的用法基本相同。
下面是使用操纵算子简化的程序,把for循环替换一下:
for (int i = 0; i < intList.size(); ++i)
{
//使用操纵算子进行输出
int num = intList.at(i);
out.setFieldWidth(10);
out << dec << num
<< bin << num
<< oct << num
<< hex << num << endl;
}
上面的bin dec oct hex都被称作操纵算子,这大大简化了代码。
关于QTextStream的操纵算子,可见Qt document:
以上的操纵算子都是Qt提供给我们的,但是有时候我们需要一些自定义的操纵算子,下面,我们来看看如何创建自己的操纵算子。
2 创建操纵算子
如何创建操纵算子,最好的参考就是看看Qt代码中如何做的,下面是bin的声明:
QTextStream &bin(QTextStream &s);
它是以QTextStream对象的引用为参数,返回值为QTextStream对象的引用的函数。 例如,我想在输出流中加入一个tab符,那么,可以这样做:
#include <QTextStream>
QTextStream& tab(QTextStream& s)
{
return s << '\t';
}
int main()
{
QTextStream out(stdout);
QList<int> intList;
intList << 12 << 16 << 18;
for (int i = 0; i < intList.size(); ++i)
{
int num = intList.at(i);
out << tab << num;
}
}