Console output in a Qt GUI app?

前端 未结 17 1617
星月不相逢
星月不相逢 2020-11-28 07:06

I have a Qt GUI application running on Windows that allows command-line options to be passed and under some circumstances I want to output a message to the console and then

相关标签:
17条回答
  • 2020-11-28 07:49

    So many answers to this topic. 0.0

    So I tried it with Qt5.x from Win7 to Win10. It took me some hours to have a good working solution which doesn't produce any problems somewhere in the chain:

    #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();
        }
    }
    


    I tried it also without the "CONFIG += console", but then you need to redirect the streams and create the console on your own:

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

    BUT this only works if you start it through a debugger, otherwise all inputs are directed towards the system too. Means, if you type a name via std::cin the system tries to execute the name as a command. (very strange)

    Two other warnings to this attempt would be, that you can't use ::FreeConsole() it won't close it and if you start it through a console the app won't close.



    Last there is a Qt help section in QApplication to this topic. I tried the example there with an application and it doesn't work for the GUI, it stucked somewhere in an endless loop and the GUI won't be rendered or it simply crashes:

    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();
    }
    


    So if you are using Windows and Qt simply use the console option, hide the console if you need the GUI and close it via exit.

    0 讨论(0)
  • 2020-11-28 07:49

    I used this header below for my projects. Hope it helps.

    #ifndef __DEBUG__H
    #define __DEBUG__H
    
    #include <QtGui>    
    
    static void myMessageOutput(bool debug, QtMsgType type, const QString & msg) {
    
        if (!debug) return;
    
        QDateTime dateTime = QDateTime::currentDateTime();
        QString dateString = dateTime.toString("yyyy.MM.dd hh:mm:ss:zzz");
    
        switch (type) {
    
            case QtDebugMsg:
                fprintf(stderr, "Debug: %s\n", msg.toAscii().data());
                break;
            case QtWarningMsg:
                fprintf(stderr, "Warning: %s\n", msg.toAscii().data());
                break;
            case QtCriticalMsg:
                fprintf(stderr, "Critical: %s\n", msg.toAscii().data());
                break;
            case QtFatalMsg:
                fprintf(stderr, "Fatal: %s\n", msg.toAscii().data());
                abort();
        }
    }
    
    #endif
    

    PS: you could add dateString to output if you want in future.

    0 讨论(0)
  • 2020-11-28 07:50

    Oh you can Output a message when using QT += gui and CONFIG += console.

    You need printf("foo bar") but cout << "foo bar" doesn't works

    0 讨论(0)
  • 2020-11-28 07:50

    First of all, why would you need to output to console in a release mode build? Nobody will think to look there when there's a gui...

    Second, qDebug is fancy :)

    Third, you can try adding console to your .pro's CONFIG, it might work.

    0 讨论(0)
  • 2020-11-28 07:52

    After a rather long struggle with exactly the same problem I found that simply

    CONFIG   += console
    

    really does the trick. It won't work until you explicitly tell QtCreator to execute qmake on the project (right click on project) AND change something inside the source file, then rebuild. Otherwise compilation is skipped and you still won't see the output on the command line. Now my program works in both GUI and cmd line mode.

    0 讨论(0)
  • 2020-11-28 07:52

    Easy

    Step1: Create new project. Go File->New File or Project --> Other Project -->Empty Project

    Step2: Use the below code.

    In .pro file

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

    Step3: Create main.cpp and copy the below code.

    #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();
    }
    

    I created necessary objects in the code for your understanding.

    Just Run It

    If you want your program to get multiple inputs with some conditions. Then past the below code in 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
    

    Hope it educates you.

    Good day,

    0 讨论(0)
提交回复
热议问题