ChatGPT解决这个技术问题 Extra ChatGPT

How do I create a simple Qt console application in C++?

I was trying to create a simple console application to try out Qt's XML parser. I started a project in VS2008 and got this template:

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

    return a.exec();
}

Since I don't need event processing, I was wondering whether I may get into trouble if I neglect to create a QCoreApplication and running the event loop. The docs state that it's recommended in most cases.

For the sake of curiosity however, I am wondering how could I make some generic task execute on the event loop and then terminate the application. I was unable to google a relevant example.

Question is too vague. If you are having a specific problem, post the code and post any errors. If you are look for a how-to, google is your best friend.
You only need to call exec() if you want to run an event loop; it sounds like you don't want to do that. That said, if you do end up wanting to run an event loop, you can cause the event loop to exit by calling qApp->quit() (where qApp is a global variable that Qt sets to point to your QApplication object)
what jeremy said: DO NOT CALL THE EXEC(). you don't need the event loop.
Sorry if this is too vague, but I had no idea how to expand it. The problem was that I was led to believe by the docs, that this template, while not generally imperative, is actually The Right Way to do things. One question then was - is this true, or can I skip it, and it was satisfactorily answered. The other question was, in essence: how do I make stuff run on the event loop and then exit. Editing to reflect, perhaps this'll make some difference.

b
baysmith

Here is one simple way you could structure an application if you want an event loop running.

// main.cpp
#include <QtCore>

class Task : public QObject
{
    Q_OBJECT
public:
    Task(QObject *parent = 0) : QObject(parent) {}

public slots:
    void run()
    {
        // Do processing here

        emit finished();
    }

signals:
    void finished();
};

#include "main.moc"

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

    // Task parented to the application so that it
    // will be deleted by the application.
    Task *task = new Task(&a);

    // This will cause the application to exit when
    // the task signals finished.    
    QObject::connect(task, SIGNAL(finished()), &a, SLOT(quit()));

    // This will run the task from the application event loop.
    QTimer::singleShot(0, task, SLOT(run()));

    return a.exec();
}

@baysmith In qt5 this QObject::connect(task, &Task::finished, &QCoreApplication::quit); seems to work too.
QCoreApplication::quit is a slot: QTimer::singleShot(0, &a, SLOT(quit()));
why do you include main.moc?
The reason why main.moc must be included is described here: stackoverflow.com/questions/34928933/…
f
fabrizioM

Don't forget to add the

CONFIG += console 

flag in the qmake .pro file.

For the rest is just using some of Qt classes. One way I use it is to spawn processes cross-platform.


S
Simon Walker

You don't need the QCoreApplication at all, just include your Qt objects as you would other objects, for example:

#include <QtCore>

int main()
{
    QVector<int> a; // Qt object

    for (int i=0; i<10; i++)
    {
        a.append(i);
    }

    /* manipulate a here */

    return 0;
}

From the docs: "Some Qt classes, such as QString, can be used without a QCoreApplication object. However, in general, we recommend that you create a QCoreApplication or a QApplication object in your main() function as early as possible.". What if I want to be careful, or perhaps plan to utilize the event loop in the future? I assume I should create some Q_OBJECT type class and do my work inside it - what should it look like?
What it should look like is going to be influenced by what you want it to do. If you eventually want to do something that uses the event loop, then use the event loop. Since you haven't nailed down the problem you are trying to solve, any answers will be maddeningly zenlike in their generality. It's like asking us what your book would look like, if you were to write a book. But, you don't tell us what sort of book you want to write.
To carry that analogy, in the most general case, a book has a cover and pages in between. I think baysmith succeeded in showing the general view of such covers, that is how to run something on the event loop end return thence.
c
code

I managed to create a simple console "hello world" with QT Creator

used creator 2.4.1 and QT 4.8.0 on windows 7

two ways to do this

Plain C++

do the following

File- new file project under projects select : other Project select "Plain C++ Project" enter project name 5.Targets select Desktop 'tick it' project managment just click next you can use c++ commands as normal c++

or

QT Console

File- new file project under projects select : other Project select QT Console Application Targets select Desktop 'tick it' project managment just click next add the following lines (all the C++ includes you need) add "#include 'iostream' " add "using namespace std; " after QCoreApplication a(int argc, cghar *argv[]) 10 add variables, and your program code..

example: for QT console "hello world"

file - new file project 'project name '

other projects - QT Console Application

Targets select 'Desktop'

project management - next

code:

    #include <QtCore/QCoreApplication>
    #include <iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
     QCoreApplication a(argc, argv);
     cout<<" hello world";
     return a.exec();
     }

ctrl -R to run

compilers used for above MSVC 2010 (QT SDK) , and minGW(QT SDK)

hope this helps someone

As I have just started to use QT recently and also searched the Www for info and examples to get started with simple examples still searching...


U
UnePierre

You could fire an event into the quit() slot of your application even without connect(). This way, the event-loop does at least one turn and should process the events within your main()-logic:

#include <QCoreApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication app( argc, argv );

    // do your thing, once

    QTimer::singleShot( 0, &app, &QCoreApplication::quit );
    return app.exec();
}

Don't forget to place CONFIG += console in your .pro-file, or set consoleApplication: true in your .qbs Project.CppApplication.


A
Andrew

You can call QCoreApplication::exit(0) to exit with code 0


V
Validus Oculus

Had the same problem. found some videos on Youtube. So here is an even simpler suggestion. This is all the code you need:

#include <QDebug>

int main(int argc, char *argv[])  
{
   qDebug() <<"Hello World"<< endl;
   return 0;
}

The above code comes from Qt5 Tutorial: Building a simple Console application by

Dominique Thiebaut

http://www.youtube.com/watch?v=1_aF6o6t-J4


This does not use the Qt event loop. It is a bare Unix main().