使用Qt时如何打印到控制台

Zlo*_*niy 149 c++ qt cout

我正在使用Qt4和C++在计算机图形学中制作一些程序.我需要能够在运行时在我的控制台中打印一些变量,而不是调试,但cout即使添加库也似乎不起作用.有没有办法做到这一点?

Goz*_*Goz 188

如果打印到足够好stderr,您可以使用以下用于调试的流:

#include<QDebug>

//qInfo is qt5.5+ only.
qInfo() << "C++ Style Info Message";
qInfo( "C Style Info Message" );

qDebug() << "C++ Style Debug Message";
qDebug( "C Style Debug Message" );

qWarning() << "C++ Style Warning Message";
qWarning( "C Style Warning Message" );

qCritical() << "C++ Style Critical Error Message";
qCritical( "C Style Critical Error Message" );

// qFatal does not have a C++ style method.
qFatal( "C Style Fatal Error Message" );
Run Code Online (Sandbox Code Playgroud)

虽然在评论中指出,但请记住,如果QT_NO_DEBUG_OUTPUT定义了qDebug消息,则会删除它们

如果你需要stdout,你可以尝试这样的事情(正如Kyle Strand指出的那样):

QTextStream& qStdOut()
{
    static QTextStream ts( stdout );
    return ts;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以调用如下:

qStdOut() << "std out!";
Run Code Online (Sandbox Code Playgroud)

  • 请不要将qDebug用于所有控制台输出.仅用于真正的调试打印使用qWarning,qCritical和qFatal来表示错误和警告.因为在使用QT_NO_DEBUG_OUTPUT进行编译时可以删除qDebug语句以保存性能并阻止应用程序混乱输出. (60认同)
  • #include <QDebug> (49认同)
  • 尽管它的名称,该函数与使用调试器进行调试无关.它是一个便利函数,Qt提供了将输出发送到stderr,可以通过define从编译中删除.因此,它是在运行时实现输出到控制台的替代方法. (11认同)
  • 我问,在不调试的情况下,必须有一个功能允许我在运行时而不是在调试期间在控制台中写入消息。 (2认同)

Cap*_*liC 147

我发现这个最有用:

#include <QTextStream>

QTextStream out(stdout);
foreach(QString x, strings)
    out << x << endl;
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么不接受答案,但肯定是最有用的. (14认同)
  • 同意.stderr适用于错误(和调试).这应该是公认的答案,因为它是唯一一个使用stdout AND qt的答案. (4认同)
  • 如果你把Goz关于如何打印错误/警告的答案中的信息,以及一些信息(遗憾地缺少Goz的答案,但在下面的评论中出现)关于`qDebug()`等实际做了什么,这将是到目前为止,优越的答案(IMO它已经优越,因为OP要求取代'std :: cout`,但40名选民似乎不同意). (2认同)

Kyl*_*and 34

写给 stdout

如果你想要一些东西,比如std::cout写入你的应用程序的标准输出,你可以简单地做以下事情(归功于CapelliC):

QTextStream(stdout) << "string to print" << endl;
Run Code Online (Sandbox Code Playgroud)

如果你想避免创建一个临时QTextStream对象,请在下面的评论中按照Yakk的建议创建一个函数来返回一个static句柄stdout:

inline QTextStream& qStdout()
{
    static QTextStream r{stdout};
    return r;
}

...

foreach(QString x, strings)
    qStdout() << x << endl;
Run Code Online (Sandbox Code Playgroud)

记得flush流周期性地,以确保实际打印输出.

写给 stderr

注意,上述技术也可用于其他输出.但是,有更多可读的方法可以写入stderr(归功于Goz和他的回答下面的评论):

qDebug() << "Debug Message";    // CAN BE REMOVED AT COMPILE TIME!
qWarning() << "Warning Message";
qCritical() << "Critical Error Message";
qFatal("Fatal Error Message");  // WILL KILL THE PROGRAM!
Run Code Online (Sandbox Code Playgroud)

qDebug()如果QT_NO_DEBUG_OUTPUT在编译时打开,则关闭.

(Goz在评论中指出,对于非控制台应用程序,这些应用程序可以打印到不同的流stderr.)


注意:所有Qt打印方法都假定const char*参数是带有终止\0字符的ISO-8859-1编码字符串.


Kyl*_*utz 30

将其添加到项目文件中:

CONFIG += console
Run Code Online (Sandbox Code Playgroud)

  • 在关于使用哪个构建系统的问题中没有给出任何信息.这仅在使用`qmake`时有用. (5认同)

Seb*_*zus 17

你想要打印什么变量?如果你的意思是QStrings,那些需要转换为c-Strings.尝试:

std::cout << myString.toAscii().data();
Run Code Online (Sandbox Code Playgroud)

  • @CoderaPurpa你需要添加`#include <iostream>` (8认同)
  • `myString.toUtf8().data()` 更好,因为它打印 ASCII 范围之外的字符。以汉字为例 (2认同)

小智 8

转到项目Properties -> Linker-> System -> SubSystem,然后将其设置为Console(/S).

  • 这(就像 Kyle Lutz 的答案)是特定于构建系统的。 (2认同)

uli*_*der 7

它也有类似于prinft的语法,例如:

qDebug ("message %d, says: %s",num,str); 
Run Code Online (Sandbox Code Playgroud)

非常方便


Eme*_*tet 5

包含iostream 库并精确地说cout是std的对象怎么样:

#include <iostream>

std::cout << "Hello" << std::endl;
Run Code Online (Sandbox Code Playgroud)