2010-07-29 216 views
41

我已經在Windows上運行Qt的GUI應用程序,允許命令行選項來傳遞,並且在某些情況下,我想輸出信息到控制檯,然後退出,例如:Qt GUI應用程序中的控制檯輸出?

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

    if (someCommandLineParam) 
    { 
    std::cout << "Hello, world!"; 
    return 0; 
    } 

    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

然而,當我從命令提示符運行應用程序時,不會顯示控制檯消息。有誰知道我可以如何讓這個工作?所有的

+0

你在窗戶上嗎?你確定它沒有啓動一個控制檯,然後立即退出嗎?我從來沒有真正使用過基本教程以外的Qt,儘管 – Falmarri 2010-07-29 08:19:10

+0

我在Windows上,並且正在從命令行運行應用程序。 – Rob 2010-07-29 08:23:04

+3

這實際上很奇怪 - 我注意到在GUI模式下沒有輸出到控制檯,但是如果從命令行運行程序並將其重定向到文件'myprogram.exe> output.txt',然後輸出到此處文件。也許像Windows版本的「貓」這樣簡單的東西可以輕鬆解決問題? – 2013-03-23 00:42:49

回答

40

Windows不真正支持雙模式應用程序。

要查看控制檯輸出,你需要創建一個控制檯應用程序

CONFIG += console 

但是,如果你在程序雙擊啓動GUI模式版本,那麼你將獲得出現一個控制檯窗口,這可能不是你想要什麼。爲了防止出現控制檯窗口,您必須創建一個GUI模式應用程序,在這種情況下,控制檯中不會輸出。

一個想法可能是創建第二個小應用程序,它是一個控制檯應用程序並提供輸出。這可以叫第二個人做這項工作。

或者你可以把所有的功能放在一個DLL中,然後創建兩個版本的.exe文件,它們具有非常簡單的調用到DLL中的主函數。一個用於GUI,另一個用於控制檯。

+0

是的,這是我已經意識到的 - 兩個應用程序! – Rob 2010-07-30 09:01:32

+0

有一個小型控制檯應用程序來調用主GUI應用程序很好,但有什麼方法可以實時將輸出反饋到控制檯應用程序,以便用戶可以看到正在發生的事情,或者顯示典型的輸出,例如 - 小時, - 版本等? – iforce2d 2013-05-27 07:11:57

+3

您可以通過調用FreeConsole來釋放控制檯。因此,如果在GUI模式下運行,您的應用程序可能會決定它的工作模式,然後隱藏控制檯。 – 2013-06-10 02:57:21

-2

首先,你可以嘗試刷新緩衝區

std::cout << "Hello, world!"<<std::endl; 

更多基於Qt的記錄,你可以嘗試使用qDebug。

+0

qDebug不適用於發佈模式構建。 – Rob 2010-07-29 08:22:44

+1

std :: endl沒有任何區別。 – Rob 2010-07-29 08:27:34

2

我在下面爲我的項目使用了這個標題。希望能幫助到你。 PS:如果將來你可以添加dateString來輸出。

+1

使用以__開頭的包括警衛正在尋求麻煩... – rubenvb 2010-07-29 09:06:44

+0

這與問題無關......但也許你是對的。 – mosg 2010-07-29 09:51:03

+0

fprintf在我的GUI應用程序中不會產生任何輸出。 – neuviemeporte 2010-12-07 18:53:03

0

首先,您爲什麼需要在發佈模式下輸出到控制檯?沒有人會想看看那裏的時候有一個GUI ...

其次,qDebug就是看中了:)

第三,你可以嘗試添加console.proCONFIG,它可能工作。

+0

此應用程序可以以兩種模式運行 - 控制檯使用命令行開關和amd作爲GUI。 – Rob 2010-07-29 09:18:59

+3

個人的控制檯是我要找的第一個地方的錯誤信息:-) – 2011-10-15 22:35:14

0

在你的.pro添加

CONFIG   += console 
+1

對不起,rubenvb說的重複。 – 2010-07-29 15:50:15

6

使用QT += gui時無法向控制檯輸出消息。

fprintf(stderr, ...)也無法打印輸出。使用QMessageBox代替顯示消息。

+0

QMessageBox可以輸出到控制檯嗎? o.0 – 2016-03-16 02:18:48

4

哦,你可以使用QT += guiCONFIG += console輸出信息。

你需要printf("foo bar")cout << "foo bar"不工作,你可能要調查,至少窗戶

+4

printf,cout或者qDebug都不能在我的配置文件中爲控制檯打印任何東西。 – Zitrax 2015-07-15 15:01:03

2

的東西,是在Windows API的AllocConsole()函數。它調用GetStdHandle幾次來重定向stdout,stderr等等。(一個快速測試顯示這並不完全符合我們希望它做的事情。你會得到一個與其他Qt東西一起打開的控制檯窗口,但是你不能輸出到它可能,因爲控制檯窗口是打開的,有一些方法可以訪問它,獲得它的句柄,或以某種方式訪問​​和操作它,以下是MSDN文檔對於那些有興趣解決這個問題的人:

AllocConsole(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx

GetStdHandle(...): http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx

(我想補充這是一個評論,但規則阻止我這樣做......)

4
void Console() 
{ 
    AllocConsole(); 
    FILE *pFileCon = NULL; 
    pFileCon = freopen("CONOUT$", "w", stdout); 

    COORD coordInfo; 
    coordInfo.X = 130; 
    coordInfo.Y = 9000; 

    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo); 
    SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS); 
} 

int main(int argc, char *argv[]) 
{ 
    Console(); 
    std::cout<<"[email protected]@"; 
    qDebug()<<"start!"; 

不能使用std ::法院如其他人所說的,我的方式是完美的,甚至對某些代碼不能包括「qdebug」!

+0

它看起來不像你使用pFileCon。或者我誤解了freopen的作用? – drescherjm 2014-04-10 17:48:50

+0

Windows用戶的竅門。任何跨平臺的推薦? – 2016-03-16 02:21:23

+0

優秀的解決方案。我想補充一點,爲了獲得Qt控制檯的行爲,你需要擴展代碼以包含stderr。 我用它來診斷安裝在客戶端計算機上的「Release」應用程序。在特定的命令行切換後,我的發佈應用程序將打開一個控制檯stdout和stderr重新路由到它時,控制檯會輸出我所有的診斷信息和Qt的錯誤,就像在你使用.pro文件中的CONFIG + = console時一樣。 – 2017-03-24 13:14:33

0

它可能是其他答案的疏忽,也可能是用戶確實需要控制檯輸出的要求,但對我來說,明顯的答案是創建一個可顯示或隱藏的輔助窗口(帶有複選框或按鈕),通過將文本行添加到文本框小部件並將其用作控制檯來顯示所有消息?

這樣的解決方案的好處是:

  • 的簡單解決方案(提供所有它顯示是一個簡單的日誌)。
  • 將「控制檯」小部件停靠在主應用程序窗口上的功能。 (無論如何,在Qt中)。
  • 能夠創建許多控制檯(如果超過1個線程等)。
  • 從本地控制檯輸出到發送通過網絡登錄到客戶端的一個非常簡單的變化。

希望這給你回味無窮,雖然我以任何方式沒有資格來推測你應該怎麼做我不,我能想象這是一個小的搜索東西通過我們任何一個人很實現的/讀!

0

確保Qt5Core.dll與您的應用程序可執行文件位於同一目錄中。

我有一個類似的問題在QT5與控制檯應用程序: 如果我開始從Qt Creator的應用,輸出文本是可見的, 如果我打開的cmd.exe並啓動相同的應用程序在那裏,沒有輸出是可見。 很奇怪!

我通過將Qt5Core.dll複製到應用程序可執行文件的目錄中解決了這個問題。

這裏是我的小控制檯應用程序:

#include <QCoreApplication> 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    int x=343; 
    QString str("Hello World"); 
    qDebug()<< str << x<<"lalalaa"; 

    QTextStream out(stdout); 
    out << "aldfjals alsdfajs..."; 
} 
0

我也玩過這個,在發現重定向輸出工作,但我從來沒有看到輸出到控制檯窗口,這是目前每一個Windows應用程序。到目前爲止,這是我的解決方案,直到找到ShowWindow和GetConsoleWindow的Qt替代品。

從不帶參數的命令提示符運行此命令 - 獲取窗口。從命令提示符運行參數(例如,cmd aaa bbb ccc) - 您可以在命令提示符窗口中獲得文本輸出 - 就像您對任何Windows控制檯應用程序所期望的一樣。

請原諒跛腳的例子 - 它代表大約30分鐘的修補。

#include "mainwindow.h" 
#include <QTextStream> 
#include <QCoreApplication> 
#include <QApplication> 
#include <QWidget> 
#include <windows.h> 

QT_USE_NAMESPACE 

int main(int argc, char *argv[]) 
{ 
    if (argc > 1) { 
     // User has specified command-line arguments 
     QCoreApplication a(argc, argv); 
     QTextStream out(stdout); 
     int  i; 

     ShowWindow (GetConsoleWindow(),SW_NORMAL); 
     for (i=1; i<argc; i++) 
      out << i << ':' << argv [i] << endl; 
     out << endl << "Hello, World" << endl; 
     out << "Application Directory Path:" << a.applicationDirPath() << endl; 
     out << "Application File Path:" << a.applicationFilePath() << endl; 
     MessageBox (0,(LPCWSTR)"Continue?",(LPCWSTR)"Silly Question",MB_YESNO); 
     return 0; 
    } else { 
     QApplication a(argc, argv); 
     MainWindow w; 

     w.setWindowTitle("Simple example"); 
     w.show(); 
     return a.exec(); 
    } 
} 
+0

不適用於我。 Qt-5.6 + CMake – 2016-12-21 09:11:25

-1

具有完全相同的問題相當長期的鬥爭後,我發現根本

CONFIG += console 

確實的伎倆。直到你明確告訴QtCreator在項目上執行qmake(在項目上右鍵點擊)並更改源文件內的內容然後重新生成,它纔會起作用。否則,編譯將被跳過,並且您仍然不會在命令行中看到輸出。 現在我的程序在GUI和cmd行模式下工作。

6

地址:

#ifdef _WIN32 
if (AttachConsole(ATTACH_PARENT_PROCESS)) { 
    freopen("CONOUT$", "w", stdout); 
    freopen("CONOUT$", "w", stderr); 
} 
#endif 

main()頂部。只有當程序在控制檯中啓動時,這將啓用輸出到控制檯,並且在其他情況下不會彈出控制檯窗口。如果你想,當你運行控制檯之外的應用程序創建一個控制檯窗口中顯示的信息,您可以更改條件:

if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) 
+0

這不適用於重定向(./executable> out.txt) – dvntehn00bz 2017-06-16 19:11:40

+1

我已經花了一些時間看這個,它看起來像你可以使用GetFileType來確定管道是否處於活動狀態。在我修改的代碼中,我設置了stdout_type = GetFileType(GetStdHandle(STD_OUTPUT_HANDLE));然後,我使用條件打包標準輸出的freopen:if(stdout_type == FILE_TYPE_UNKNOWN) 這似乎有效地允許進程輸出到現有管道(如果可用),但在管道未打開時輸出到父控制檯。 – dvntehn00bz 2017-06-16 19:51:58

+0

這是一個簡單的修復,在我的情況下在Win7/Qt 5.10中使用QGuiApplication也需要控制檯輸出。 – 2017-12-23 06:13:06

-1

第一步:創建新的項目。 Go File-> New File or Project - > Other Project - > Empty Project

Step2:使用下面的代碼。

在.pro文件

QT +=widgets 
CONFIG += console 
TARGET = minimal 
SOURCES += \ main.cpp 

第三步:main.cpp中創建和複製下面的代碼。

#include <QApplication> 
#include <QtCore> 

using namespace std; 

QTextStream in(stdin); 
QTextStream out(stdout); 

int main(int argc, char *argv[]){ 
QApplication app(argc,argv); 
qDebug() << "Please enter some text over here: " << endl; 
out.flush(); 
QString input; 
input = in.readLine(); 
out << "The input is " << input << endl; 
return app.exec(); 
} 

我在代碼中創建了必要的對象以供您理解。

只要運行它

如果你希望你的程序獲得多個輸入一些條件。然後通過Main.cpp中的下面的代碼

#include <QApplication> 
#include <QtCore> 

using namespace std; 

QTextStream in(stdin); 
QTextStream out(stdout); 

int main(int argc, char *argv[]){ 
    QApplication app(argc,argv); 
    qDebug() << "Please enter some text over here: " << endl; 
    out.flush(); 
    QString input; 
    do{ 
     input = in.readLine(); 
     if(input.size()==6){ 
      out << "The input is " << input << endl; 
     } 
     else 
     { 
      qDebug("Not the exact input man"); 
     } 
    }while(!input.size()==0); 

    qDebug(" WE ARE AT THE END"); 

    // endif 
    return app.exec(); 
} // end main 

希望它教育你。

好日子

0

所以很多回答這個話題。 0.0

所以我試了Qt5。x從Win7到Win10。我花了幾個小時有不鏈產生任何問題的地方了良好的合作解決方案:

#include "mainwindow.h" 

#include <QApplication> 

#include <windows.h> 
#include <stdio.h> 
#include <iostream> 

// 
// Add to project file: 
// CONFIG += console 
// 

int main(int argc, char *argv[]) 
{ 
    if(argc < 2) 
    { 
    #if defined(Q_OS_WIN) 
     ::ShowWindow(::GetConsoleWindow(), SW_HIDE); //hide console window 
    #endif 
     QApplication a(argc, argv); 
     MainWindow *w = new MainWindow; 
     w->show(); 
     int e = a.exec(); 
     delete w; //needed to execute deconstructor 
     exit(e); //needed to exit the hidden console 
     return e; 
    } 
    else 
    { 
     QCoreApplication a(argc, argv); 
     std::string g; 
     std::cout << "Enter name: "; 
     std::cin >> g; 
     std::cout << "Name is: " << g << std::endl; 
     exit(0); 
     return a.exec(); 
    } 
} 


我試了一下還沒有「CONFIG + =控制檯」,但你需要重定向數據流和創建你自己的控制檯:

#ifdef _WIN32 
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()){ 
    freopen("CONOUT$", "w", stdout); 
    freopen("CONOUT$", "w", stderr); 
    freopen("CONIN$", "r", stdin); 
} 
#endif 

BUT這隻有在你通過調試器啓動時纔有效,否則所有的輸入都會直接指向系統。意思是,如果你通過std :: cin鍵入一個名字,系統會嘗試執行命令作爲命令。 (非常奇怪)

其他兩個警告這個嘗試是,你不能使用:: FreeConsole()它不會關閉它,如果你通過控制檯啓動它,應用程序將不會關閉。



最後還有一個Qt help section in QApplication這個話題。我試過的例子有一個應用程序,它不會爲GUI工作,它在一個無限循環的地方stucked和GUI不會被渲染或者它只是崩潰:

QCoreApplication* createApplication(int &argc, char *argv[]) 
{ 
    for (int i = 1; i < argc; ++i) 
     if (!qstrcmp(argv[i], "-no-gui")) 
      return new QCoreApplication(argc, argv); 
    return new QApplication(argc, argv); 
} 

int main(int argc, char* argv[]) 
{ 
    QScopedPointer<QCoreApplication> app(createApplication(argc, argv)); 

    if (qobject_cast<QApplication *>(app.data())) { 
     // start GUI version... 
    } else { 
     // start non-GUI version... 
    } 

    return app->exec(); 
} 


因此,如果您使用的是Windows和Qt,那麼只需使用控制檯選項,如果需要使用GUI並通過退出關閉它,請隱藏控制檯。

相關問題