2012-04-18 139 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

相關問題