我有一个应用程序,当通过终端运行时,用户可以选择命令行模式或GUI模式。
使用std::cout
时,似乎没有任何输出到控制台。 std::cout
语句不适用于主事件循环。
我已将CONFIG += console
添加到我的.pro
文件中。
目前,我一直在使用QTextStream()
,效果很好:
QTextStream(cout) << "Hello World" << std::endl;
我的问题是:
为什么我不能使用std::cout
?这是否与影响输入和输出流的Qt
有关?我无法在Qt的文档中找到任何关于此文档的文档。
int main(int argc, char *argv[])
{
std::cout << argv[1] << std::endl; //This is being outputted.
//if(argc == 2 && !strcmp(argv[1],"-win")){
if(true){ //Just for this example's sake
QApplication a(argc, argv);
std::cout << "Hello" << std::endl; //This is not being ouputted.
MainWindow w;
w.show();
return a.exec();
}
else
{
qDebug() << "Console Mode.\n";
std::cout << "Console Mode.\n";
//Do stuff
}
}
答案 0 :(得分:2)
这不是Qt问题,而是std::cout
如何运作。你好像在这里炸掉你的std::cout
:
std::cout << argv[1] << std::endl;
即使使用这样的简单程序,您的问题也可以重现:
TEMPLATE = app
TARGET = main
CONFIG -= qt
SOURCES += main.cpp
#include <iostream>
int main(int /*argc*/, char **argv)
{
std::cout << argv[1] << std::endl;
std::cout << "Hello stdout!" << std::endl;
if (std::cout.bad())
std::cerr << "I/O error while reading\n";
return 0;
}
Success: qmake && make && ./main foo
Failure: qmake && make && ./main
在您的情况下,argv[1]
为零,因此std::cout
不再打印任何内容。我建议要么一直传递一个参数和/或使用一些帮助用法打印来检查argc。最好的办法是在最近使用QtCore中的内置命令行解析器。
你可以问为什么?因为它是未定义的行为。您可以阅读documentation:
中的详细信息basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);
构造并检查sentry对象后,检查sb是否为空指针。如果是,则执行setstate(badbit)并退出。
如果您碰巧遇到IDE本身的问题,例如QtCreator,请在QtCreator的情况下执行以下步骤:
Projects -> Select a kit -> Run tab -> Run section -> Arguments
答案 1 :(得分:1)
对我来说工作正常:
QT += core
QT -= gui
TARGET = untitled
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
main.cpp中:
#include <QCoreApplication>
#include <QTextStream>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::cout << "Hello World" << std::endl;
return a.exec();
}
编辑:
#include <QCoreApplication>
#include <QTextStream>
#include <QtWidgets/QWidget>
#include <QDebug>
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "test" << std::endl; // <--- THE PROBLEM IS HERE...IF YOU TRY A SIMPLE STRING IT WORKS FINE SO THE PROBLEM IS argv[1] IS AN EMPTY STRING
//if(argc == 2 && !strcmp(argv[1],"-win")){
if(true){
//Just for this example's sake
QCoreApplication a(argc, argv);
std::cout << "Hello" << std::endl; //This is not being ouputted.
return a.exec();
}
else
{
qDebug() << "Console Mode.\n";
std::cout << "Console Mode.\n";
//Do stuff
} }