88 votes

Comment créer une application console Qt simple en C++ ?

J'ai essayé de créer une application console simple pour tester l'analyseur XML de Qt. J'ai lancé un projet dans VS2008 et j'ai obtenu ce modèle :

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

    return a.exec();
}

Comme je n'ai pas besoin de traitement d'événements, je me demandais si je pouvais avoir des problèmes si je négligeais de créer une QCoreApplication et de lancer la boucle d'événements. La documentation indique que c'est recommandé dans la plupart des cas.

Cependant, par curiosité, je me demande comment je pourrais faire en sorte qu'une tâche générique s'exécute dans la boucle d'événements et mette ensuite fin à l'application. Je n'ai pas réussi à trouver un exemple pertinent sur Google.

0 votes

La question est trop vague. Si vous rencontrez un problème spécifique, postez le code et signalez les erreurs éventuelles. Si vous cherchez un mode d'emploi, Google est votre meilleur ami.

0 votes

Vous n'avez besoin d'appeler exec() que si vous voulez exécuter une boucle d'événement ; il semble que vous ne vouliez pas le faire. Cela dit, si vous souhaitez exécuter une boucle d'événements, vous pouvez faire en sorte que la boucle d'événements se termine en appelant qApp->quit() (où qApp est une variable globale que Qt définit pour pointer vers votre objet QApplication).

0 votes

Ce que Jeremy a dit : NE PAS APPELER L'EXEC(). Vous n'avez pas besoin de la boucle d'événement.

117voto

baysmith Points 2964

Voici une façon simple de structurer une application si vous souhaitez faire tourner une boucle d'événements.

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

4 votes

@baysmith Dans qt5 ceci QObject::connect(task, &Task::finished, &QCoreApplication::quit); semble également fonctionner.

0 votes

QCoreApplication::quit est une fente : QTimer::singleShot(0, &a, SLOT(quit()));

3 votes

Pourquoi inclure main.moc ?

19voto

fabrizioM Points 11498

N'oubliez pas d'ajouter le

CONFIG += console 

dans le fichier .pro de qmake.

Pour le reste, il suffit d'utiliser certaines classes Qt. L'une des façons dont je l'utilise est de lancer des processus sur plusieurs plates-formes.

4voto

Simon Walker Points 913

Vous n'avez pas besoin de la QCoreApplication du tout, incluez simplement vos objets Qt comme vous le feriez pour d'autres objets, par exemple :

#include <QtCore>

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

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

    /* manipulate a here */

    return 0;
}

7 votes

Extrait de la documentation : "Certaines classes Qt, telles que QString, peuvent être utilisées sans objet QCoreApplication. Cependant, en général, nous vous recommandons de créer un objet QCoreApplication ou QApplication dans votre fonction main() le plus tôt possible". Que faire si je veux être prudent, ou si je prévois d'utiliser la boucle d'événement à l'avenir ? Je suppose que je devrais créer une classe de type Q_OBJECT et faire mon travail à l'intérieur - à quoi devrait-elle ressembler ?

2 votes

Ce à quoi il doit ressembler sera influencé par ce que vous voulez qu'il fasse. Si vous voulez éventuellement faire quelque chose qui utilise la boucle d'événement, alors utilisez la boucle d'événement. Puisque vous n'avez pas cerné le problème que vous essayez de résoudre, toute réponse sera d'une généralité exaspérante. C'est comme si vous nous demandiez à quoi ressemblerait votre livre, si vous deviez en écrire un. Mais, vous ne nous dites pas quel genre de livre vous voulez écrire.

0 votes

Pour poursuivre cette analogie, dans le cas le plus général, un livre a une couverture et des pages entre les deux. Je pense que Baysmith a réussi à montrer la vue générale de telles couvertures, c'est à dire comment exécuter quelque chose sur la boucle d'événement et retourner de là.

3voto

code Points 21

J'ai réussi à créer une console simple "hello world" avec QT Creator

a utilisé creator 2.4.1 et QT 4.8.0 sur Windows 7

deux façons de procéder

C++ pur et simple

faire ce qui suit

  1. Fichier - nouveau projet de fichier
  2. sous projets, sélectionnez : autre projet
  3. sélectionnez "Projet C++ simple".
  4. entrer le nom du projet 5. les cibles sélectionnent le bureau "cocher".
  5. gestion de projet cliquez sur suivant
  6. vous pouvez utiliser les commandes c++ comme c++ normal

ou

Console QT

  1. Fichier - nouveau projet de fichier
  2. sous projets, sélectionnez : autre projet
  3. sélectionnez QT Console Application
  4. Cibles sélectionnées Desktop " cocher ".
  5. gestion de projet cliquez sur suivant
  6. ajoutez les lignes suivantes (tous les includes C++ dont vous avez besoin)
  7. ajouter "#include 'iostream' "
  8. ajouter "using namespace std ; "
  9. après QCoreApplication a(int argc, cghar *argv[]) 10 ajouter des variables, et le code de votre programme..

Exemple : pour la console QT "hello world".

file - nouveau projet de fichier 'nom du projet'.

Autres projets - Application console QT

Les cibles sélectionnent 'Desktop'.

gestion de projet - suivant

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 pour exécuter

compilateurs utilisés pour MSVC 2010 (QT SDK) et minGW (QT SDK).

J'espère que cela aidera quelqu'un

J'ai commencé à utiliser QT récemment et j'ai également cherché sur le site Web des informations et des exemples pour commencer à utiliser des exemples simples, mais je cherche encore...

1voto

Andrew Points 14301

Vous pouvez appeler QCoreApplication::exit(0) pour sortir avec le code 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X