2

我正在尝试使用 aQTextStream来格式化数字输出。我已将我的问题简化为一个小测试程序来演示我的问题。以下是我的代码:

#include <QCoreApplication>
#include <QTextStream>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("testfile.txt");

    if (file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream out(&file);

        out.setFieldAlignment(QTextStream::AlignLeft);
        out.setFieldWidth(5);

        out << "1" << "A" << endl;
        out << "2" << "B" << endl;
        out << "3" << "C" << endl;
        out << "4" << "D" << endl;
        out << "5" << "E" << endl;
        out << "6" << "F" << endl;
    }

    return a.exec();
}

这是上述程序生成的输出:

1    A    
    2    B    
    3    C    
    4    D    
    5    E    
    6    F    

注意到底部五行的缩进了吗?那是我的问题,我不希望缩进开始新行。我希望每一行都从第 0 列开始,并写入一个五列宽(我的字段宽度)的值,并使其左对齐。

我已经尝试过一段时间没有运气了。如果我可以让它在上面的小测试程序中工作,我想我可以成功地将这个更改移植到我的更大的程序中,该程序编写一个文本文件。

4

2 回答 2

2

One way of overcoming this is to use qSetFieldWidth before and after writing endl. Setting width to zero before writing endl and again setting to the previous value.

It will not change your code much because of the convenient qSetFieldWidth function which is equivalent to QTextStream::setFieldWidth :

#include <QCoreApplication>
#include <QTextStream>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("testfile.txt");

    if (file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream out(&file);

        out.setFieldAlignment(QTextStream::AlignLeft);
        out.setFieldWidth(5);

        out << "1" << "A" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
        out << "2" << "B" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
        out << "3" << "C" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
        out << "4" << "D" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
        out << "5" << "E" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
        out << "6" << "F" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
    }

    return a.exec();
}

Now the result is :

1    A    
2    B    
3    C    
4    D    
5    E    
6    F  
于 2015-01-16T07:19:31.130 回答
2

QTextStream::setFieldWidth文档:

注意:字段宽度适用于调用此函数后附加到此流的每个元素(例如,它也填充 endl)。

显然,这是您的问题的原因:endl符号填充了 4 个空格,就像您放入流中的任何其他字符一样。一种可能的解决方法是在添加 endl 之前将字段宽度设置为 0 并在此之后重置字段宽度,或者完全禁用流填充并依赖其他填充方式,例如QString::leftJustified.

于 2015-01-15T20:48:40.883 回答