1 操纵算子
QTextStream的格式化输出:
#include <QTextStream>int main(int argc, char *argv[]){QTextStream out(stdout);int i = 60;out.setIntegerBase(16); // 设置16进制显示,所以使用输入输出流,也可以很容易的进行进制转换out << i << endl; // output:3creturn 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 hex12 0b1100 014 0xc16 0b10000 020 0x1018 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;}}
