Wie erstelle ich eine einfache Qt-Konsolenanwendung in C ++?

77

Ich habe versucht, eine einfache Konsolenanwendung zu erstellen, um den XML-Parser von Qt auszuprobieren. Ich habe ein Projekt in VS2008 gestartet und diese Vorlage erhalten:

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

    return a.exec();
}

Da ich keine Ereignisverarbeitung benötige, habe ich mich gefragt, ob ich möglicherweise Probleme bekomme, wenn ich es versäume, eine QCoreApplication zu erstellen und die Ereignisschleife auszuführen. In den Dokumenten wird angegeben, dass dies in den meisten Fällen empfohlen wird.

Aus Neugier frage ich mich jedoch, wie ich eine generische Aufgabe in der Ereignisschleife ausführen und dann die Anwendung beenden könnte. Ich konnte kein relevantes Beispiel googeln.

neuviemeporte
quelle
Die Frage ist zu vage. Wenn Sie ein bestimmtes Problem haben, geben Sie den Code und alle Fehler ein. Wenn Sie nach einer Anleitung suchen, ist Google Ihr bester Freund.
John Dibling
Sie müssen exec () nur aufrufen, wenn Sie eine Ereignisschleife ausführen möchten. es hört sich so an, als ob du das nicht tun willst. Wenn Sie jedoch eine Ereignisschleife ausführen möchten, können Sie die Ereignisschleife beenden, indem Sie qApp-> quit () aufrufen (wobei qApp eine globale Variable ist, die Qt so festlegt, dass sie auf Ihr QApplication-Objekt verweist)
Jeremy Friesner
Was Jeremy sagte: RUFEN SIE NICHT DIE EXEC () AN. Sie benötigen die Ereignisschleife nicht.
ianmac45
2
Entschuldigung, wenn dies zu vage ist, aber ich hatte keine Ahnung, wie ich es erweitern sollte. Das Problem war, dass ich von den Dokumenten zu der Überzeugung gebracht wurde, dass diese Vorlage, obwohl sie im Allgemeinen nicht zwingend erforderlich ist, tatsächlich der richtige Weg ist, Dinge zu tun. Eine Frage war dann - ist das wahr, oder kann ich es überspringen, und es wurde zufriedenstellend beantwortet. Die andere Frage war im Wesentlichen: Wie kann ich Dinge in der Ereignisschleife ausführen und dann beenden? Bearbeiten, um zu reflektieren, vielleicht macht dies einen Unterschied.
Neuviemeporte

Antworten:

107

Hier ist eine einfache Möglichkeit, eine Anwendung zu strukturieren, wenn eine Ereignisschleife ausgeführt werden soll.

// 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();
}
Buchschmied
quelle
4
@baysmith In qt5 QObject::connect(task, &Task::finished, &QCoreApplication::quit);scheint dies auch zu funktionieren.
Erik Sjölund
QCoreApplication::quitist ein Slot:QTimer::singleShot(0, &a, SLOT(quit()));
Answeror
3
warum schließt main.mocdu ein
Yola
Der Grund, warum enthalten sein main.mocmuss, wird hier beschrieben: stackoverflow.com/questions/34928933/…
tantuni
18

Vergessen Sie nicht, das hinzuzufügen

CONFIG += console 

Flag in der qmake .pro-Datei.

Im Übrigen werden nur einige der Qt-Klassen verwendet. Eine Möglichkeit, die ich verwende, besteht darin, Prozesse plattformübergreifend zu erzeugen.

fabrizioM
quelle
4

Sie brauchen das QCoreApplicationüberhaupt nicht, fügen Sie einfach Ihre Qt-Objekte wie andere Objekte hinzu, zum Beispiel:

#include <QtCore>

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

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

    /* manipulate a here */

    return 0;
}
Simon Walker
quelle
6
Aus den Dokumenten: "Einige Qt-Klassen, wie z. B. QString, können ohne ein QCoreApplication-Objekt verwendet werden. Im Allgemeinen empfehlen wir jedoch, so früh wie möglich eine QCoreApplication oder ein QApplication-Objekt in Ihrer main () -Funktion zu erstellen." Was ist, wenn ich vorsichtig sein oder die Ereignisschleife in Zukunft nutzen möchte? Ich gehe davon aus, dass ich eine Q_OBJECT-Typklasse erstellen und meine Arbeit darin ausführen sollte - wie sollte sie aussehen?
Neuviemeporte
2
Wie es aussehen sollte, wird von dem beeinflusst, was Sie möchten. Wenn Sie irgendwann etwas tun möchten, das die Ereignisschleife verwendet, verwenden Sie die Ereignisschleife. Da Sie das Problem, das Sie zu lösen versuchen, nicht genau festgelegt haben, sind alle Antworten in ihrer Allgemeinheit unglaublich zenartig. Es ist, als würden Sie uns fragen, wie Ihr Buch aussehen würde, wenn Sie ein Buch schreiben würden. Aber Sie sagen uns nicht, welche Art von Buch Sie schreiben möchten.
Wrosecrans
Um diese Analogie zu tragen, hat ein Buch im allgemeinsten Fall ein Cover und Seiten dazwischen. Ich denke, Baysmith hat es geschafft, die allgemeine Ansicht solcher Cover zu zeigen, also wie man etwas auf der Event-Schleife ausführt, um von dort zurückzukehren.
Neuviemeporte
3

Ich habe es geschafft, mit QT Creator eine einfache Konsole "Hallo Welt" zu erstellen

verwendete Creator 2.4.1 und QT 4.8.0 unter Windows 7

zwei Möglichkeiten, dies zu tun

Einfaches C ++

Mach Folgendes

  1. Datei - neues Dateiprojekt
  2. Wählen Sie unter Projekte: anderes Projekt
  3. Wählen Sie "Plain C ++ Project".
  4. Projektname eingeben 5.Ziele Desktop auswählen 'ankreuzen'
  5. Projektmanagement einfach auf Weiter klicken
  6. Sie können c ++ - Befehle wie normales c ++ verwenden

oder

QT-Konsole

  1. Datei - neues Dateiprojekt
  2. Wählen Sie unter Projekte: anderes Projekt
  3. Wählen Sie QT Console Application
  4. Ziele wählen Desktop 'ankreuzen'
  5. Projektmanagement einfach auf Weiter klicken
  6. Fügen Sie die folgenden Zeilen hinzu (alle C ++ - Elemente, die Sie benötigen)
  7. füge "#include 'iostream'" hinzu
  8. füge "using namespace std;" hinzu
  9. Nach QCoreApplication a (int argc, cghar * argv []) 10 fügen Sie Variablen und Ihren Programmcode hinzu.

Beispiel: für QT-Konsole "Hallo Welt"

Datei - neue Datei Projekt 'Projektname'

andere Projekte - QT Console Application

Ziele wählen 'Desktop'

Projektmanagement - weiter

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 zum Ausführen

Compiler für MSVC 2010 (QT SDK) und minGW (QT SDK)

hoffe das hilft jemandem

Da ich gerade erst angefangen habe, QT zu verwenden, und auch im Www nach Informationen und Beispielen gesucht habe, um mit einfachen Beispielen zu beginnen, die noch suchen ...

Code
quelle
1

Sie können QCoreApplication :: exit (0) aufrufen, um mit Code 0 zu beenden

Andrew
quelle
0

Sie können ein Ereignis auch ohne connect () in den quit () - Slot Ihrer Anwendung auslösen. Auf diese Weise macht die Ereignisschleife mindestens eine Runde und sollte die Ereignisse in Ihrer main () - Logik verarbeiten:

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

Vergessen Sie nicht, CONFIG += consolein Ihrer .pro-Datei zu platzieren oder consoleApplication: truein Ihrer .qbs Project.CppApplication festzulegen.

UnePierre
quelle
-1

Hatte das gleiche Problem. habe einige Videos auf Youtube gefunden. Hier ist also ein noch einfacherer Vorschlag. Dies ist der gesamte Code, den Sie benötigen:

#include <QDebug>

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

Der obige Code stammt aus dem Qt5-Tutorial: Erstellen einer einfachen Konsolenanwendung von

Dominique Thiebaut

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

user3423766
quelle
3
Dies verwendet nicht die Qt-Ereignisschleife. Es ist ein nacktes Unix-Main ().
Raúl Salinas-Monteagudo