1 操纵算子

QTextStream的格式化输出:

  1. #include <QTextStream>
  2. int main(int argc, char *argv[])
  3. {
  4. QTextStream out(stdout);
  5. int i = 60;
  6. out.setIntegerBase(16); // 设置16进制显示,所以使用输入输出流,也可以很容易的进行进制转换
  7. out << i << endl; // output:3c
  8. return 0;
  9. }

但是,如果我想输出一个数字表格,每列分别以十进制,二进制,八进制,十六进制进行显示,那么,用上一篇的方法,可以这样写

  1. #include <QTextStream>
  2. int main()
  3. {
  4. QTextStream out(stdout);
  5. out.setNumberFlags(QTextStream::ShowBase);
  6. out.setFieldWidth(10);
  7. out << "dec"
  8. << "bin"
  9. << "oct"
  10. << "hex" << endl;
  11. QList<int> intList;
  12. intList << 12 << 16 << 18;
  13. for (int i = 0; i < intList.size(); ++i)
  14. {
  15. int num = intList.at(i);
  16. out.setIntegerBase(10);
  17. out << num;
  18. out.setIntegerBase(2);
  19. out << num;
  20. out.setIntegerBase(8);
  21. out << num;
  22. out.setIntegerBase(16);
  23. out << num << endl;
  24. }
  25. /* 输出:
  26. dec bin oct hex
  27. 12 0b1100 014 0xc
  28. 16 0b10000 020 0x10
  29. 18 0b10010 022 0x12
  30. */
  31. }

在for循环中,每次输出一种进制,就需要重新设置输出标志,这显得很不灵活。为了解决这样的问题,可以使用操纵算子,Qt中的操纵算子和标准库中的用法基本相同。


下面是使用操纵算子简化的程序,把for循环替换一下:

  1. for (int i = 0; i < intList.size(); ++i)
  2. {
  3. //使用操纵算子进行输出
  4. int num = intList.at(i);
  5. out.setFieldWidth(10);
  6. out << dec << num
  7. << bin << num
  8. << oct << num
  9. << hex << num << endl;
  10. }

上面的bin dec oct hex都被称作操纵算子,这大大简化了代码。

关于QTextStream的操纵算子,可见Qt document:
image.png
以上的操纵算子都是Qt提供给我们的,但是有时候我们需要一些自定义的操纵算子,下面,我们来看看如何创建自己的操纵算子。

2 创建操纵算子

如何创建操纵算子,最好的参考就是看看Qt代码中如何做的,下面是bin的声明:

  1. QTextStream &bin(QTextStream &s);

它是以QTextStream对象的引用为参数,返回值为QTextStream对象的引用的函数。 例如,我想在输出流中加入一个tab符,那么,可以这样做:

  1. #include <QTextStream>
  2. QTextStream& tab(QTextStream& s)
  3. {
  4. return s << '\t';
  5. }
  6. int main()
  7. {
  8. QTextStream out(stdout);
  9. QList<int> intList;
  10. intList << 12 << 16 << 18;
  11. for (int i = 0; i < intList.size(); ++i)
  12. {
  13. int num = intList.at(i);
  14. out << tab << num;
  15. }
  16. }