我的QTextStream的输入和输出不起作用

编程语言 2026-07-09

所使用的IDE: QT Creator 19.0.2

我一直在按照这个YouTube视频学习如何在QT中进行输入输出。照着视频把代码写好、运行后,理论上应该先打印出“请输入你的名字:”,然后你输入你的名字;但实际却一次性把所有输出流输出完毕。因此它输出的是:

请输入你的名字:
你输入的是:
请输入你的年龄:
你输入的不是一个有效数字!!!!!!

这似乎是缓冲区的问题。但我已经严格按照视频逐字执行,结果仍然这样。我使用QT版本6.10.3,视频是五年前的,因此现在可能有更新导致实现方式不同。

这是我的代码:

#include <QCoreApplication>
#include <QTextStream>

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

    //---- QTextStream
    QTextStream qin(stdin);
    QTextStream qout(stdout);

    //--- Output
    qout << "Enter your name: " << Qt::endl;

    //--- Reading
    QString name = qin.readLine();

    //--- Flushing
    qout << "You entered: " << name << "\n";
    qout << "Enter your age:\n";
    qout.flush();

    bool ok;
    int age = qin.readLine().toInt(&ok);

    if(ok)
    {
        qout << "You are " << age << " years old";
    }
    else
    {
        qout << "You have failed to enter a valid number!!!!!!!";
    }
    qout.flush();

    return a.exec();
}

我甚至在一个新项目文件夹里做了测试,该文件夹里只有 main.cppmainwindow.cpp 以及mainwindow的头文件。

更新:我查看了本地变量窗格,想看看具体情况。对于name,它显示为不可访问。下面是相关截图:

QT Creator 本地变量窗格的截图

更新2:我通过命令提示符运行可执行文件,结果没有任何输出,不过在任务管理器中可以看到程序正在运行。我运行该可执行文件时的文件层级结构如下:

C:\Users\Vince\Desktop\Coding\QTProjectFiles\IOtest\
└── build\
    └── Desktop_Qt_6_11_1_MinGW_64_bit-Debug\
        └── IOtest.exe

解决方案

#include <QTextStream>

int main()
{
    QTextStream qin(stdin);
    QTextStream qout(stdout);

    qout << "Enter your name: " << Qt::flush;
    QString name = qin.readLine();

    qout << "You entered: " << name << "\n" << Qt::flush;
    qout << "Enter your age: " << Qt::flush;

    bool ok;
    int age = qin.readLine().toInt(&ok);

    if (ok)
        qout << "You are " << age << " years old\n" << Qt::flush;
    else
        qout << "You have failed to enter a valid number!!!!!!!\n" << Qt::flush;

    return 0;
}

问题出在哪里?

原本的代码使用 Qt::endl,它会添加换行,但并不总是能立即刷新输出缓冲区。这会导致所有输出一次性显示,而不是等待用户输入。

为什么这个修复有效?

使用 Qt::flush 可以在 qin.readLine() 等待输入之前,确保输出会立即发送到终端。这样每个提示都会在用户输入之前正确显示。

另外移除了 QCoreApplicationa.exec(),因为简单的控制台I/O不需要事件循环。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章