2012-04-18 155 views
2

如果程序没有给出任何参数,它将作为GUI应用程序启动,如果给出参数,则通过命令行运行。我可以通过属性>链接器>子系统(控制台/ SUBSYSTEM:CONSOLE)显示并打印到控制台,但这样可以使控制台在应用程序启动时始终显示,如何有选择地显示控制台,以便在应用程序与GUI一起运行时不会出现。我已经浏览过这个网站,但是我发现的所有内容都是如何将它设置为仅适用于Windows应用程序,并且我需要它作为C + + - Qt - Visual Studio 2010 - 与gui和控制台的应用程序

谢谢!

+0

你在Qt中如何做到这一点?你是否同时使用QApplication和QCoreApplication?如果没有,您是否尝试过QApplication *应用程序;那么if(argc == 1)app = new QCoreApplication(...); else app = new QApplication(...);? – emsr 2012-04-18 16:43:31

+0

现在我正在做的是检查argc,如果> 1我不调用show()并使用一个单独的构造函数来设置数据,并基本上为用户点击...我不熟悉你上面的东西,我是C++和Qt的新手......是否有两个完全独立的类,一个是用gui构造的,另一个是用于控制台应用程序的构造。导致这看起来像我会做很多重复,我试图避免 – user1341929 2012-04-18 16:53:35

+0

QCoreApplication是QApplication的基类继承QCoreApplication。 QCoreApplication用于控制台应用程序。 (我应该在上面声明QCoreApplication *应用程序)。我想如果你指定的应用程序像我上面你应该得到一个控制台应用程序argc == 1和gui应用程序,否则。 – emsr 2012-04-18 18:08:46

回答

0

你可以使用windows子系统,当你需要一个控制台的时候调用AllocConsole,同时应用程序也有一个gui。

+0

我找到了使用c#而不是C++的参考资料,并且使用它时遇到了麻烦......我发现的所有参考都不适用于Qt应用程序... – user1341929 2012-04-18 16:33:56

+0

不适用于Qt,但请看看这个http://www.halcyon.com/~ast/dload/guicon.htm&http://comsci.liu.edu/~murali/win32gui/Win32Apps.htm – 2012-04-18 16:41:28

+0

谢谢,但我特别需要使用Qt来做到这一点。 .. – user1341929 2012-04-18 16:50:23

3

下面是一些代码,我已经躺在附近,创建一个控制台和附加的输入和输出是:

#include <Windows.h> 
#include <stdio.h> 
#include <io.h> 
#include <fcntl.h> 

void Console::createConsole() 
{ 
    AllocConsole(); 
    SetConsoleTitle("Debug console"); 

    int hConHandle; 
    long lStdHandle; 

    FILE *fp; // redirect unbuffered STDOUT to the console 
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 

    // redirect unbuffered STDIN to the console 
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 

    // redirect unbuffered STDERR to the console 
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 
} 

我没有使用Qt的,但你应该能够坚持在某个地方,并使其发挥作用。

编辑:添加标题需要

+0

这有点作用,但并没有解决大问题。如果参数通过,OP想要使用控制台。但是,如果从控制台传递参数,则会打开一个新控制台,而现有控制台仍然不会接收任何输出。 – Cerno 2016-04-08 09:21:11

4

这工作我想:

#include <QtGui/QApplication> 
#include <QtGui/QMainWindow> 


int 
main(int n_app_args, char **app_arg) 
{ 
    QCoreApplication * application = 0; 

    if (n_app_args == 1) 
    { 
     application = new QCoreApplication(n_app_args, app_arg); 
    } 
    else 
    { 
     application = new QApplication(n_app_args, app_arg); 
     QMainWindow * mainWindow = new QMainWindow(); 
     mainWindow->show(); 
    } 


    return application->exec(); 
} 

与参数调用它,你会得到一点点(空)窗口。不带任何参数和窗口来调用它。

+1

但这是否解决了这个问题?如果使用SUBSYSTEM:CONSOLE进行编译,您仍然可以使用QApplication获得控制台,并且如果使用SUBSYSTEM:WINDOWS进行编译,则不会在控制台上输出。 – Cerno 2016-04-08 09:26:09

相关问题