2010-11-14 39 views
53

Estaba intentando crear una aplicación de consola simple para probar el analizador XML de Qt. Empecé un proyecto en VS2008 y tengo esta plantilla:¿Cómo creo una aplicación simple de la consola Qt en C++?

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

    return a.exec(); 
} 

Dado que no necesito de procesamiento de eventos, me preguntaba si puedo tener problemas si me descuido para crear un QCoreApplication y ejecutar el bucle de eventos. Los documentos indican que se recomienda en la mayoría de los casos.

En aras de la curiosidad, sin embargo, me pregunto cómo podría hacer que una tarea genérica se ejecute en el ciclo de eventos y luego terminar la aplicación. No pude buscar en Google un ejemplo relevante.

+0

pregunta es demasiado vaga. Si tiene un problema específico, publique el código y publique cualquier error. Si buscas un tutorial, google es tu mejor amigo. –

+0

Solo necesita llamar a exec() si desea ejecutar un bucle de evento; parece que no quieres hacer eso.Dicho esto, si termina queriendo ejecutar un bucle de evento, puede hacer que el bucle de evento salga llamando a qApp-> quit() (donde qApp es una variable global que Qt establece para apuntar a su objeto QApplication) –

+0

qué Jeremy dijo: NO LLAME AL EXEC(). no necesitas el ciclo de eventos. – ianmac45

Respuesta

80

Esta es una manera sencilla se podría estructurar una aplicación si quieres un bucle en funcionamiento evento.

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

@baysmith En qt5, este 'QObject :: connect (task, & Task :: finished, & QCoreApplication :: quit);' parece funcionar también. –

+0

'QCoreApplication :: quit' es una ranura:' QTimer :: singleShot (0, & a, SLOT (salir())); ' – Answeror

+0

¿por qué incluye' main.moc'? – Yola

5

No es necesario el QCoreApplication en absoluto, sólo se incluyen los objetos de Qt como lo haría con otros objetos, por ejemplo:

#include <QtCore> 

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

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

    /* manipulate a here */ 

    return 0; 
} 
+4

De los documentos: "Algunas clases Qt, como QString, se pueden usar sin un objeto QCoreApplication. Sin embargo, en general, recomendamos que cree un objeto QCoreApplication o QApplication en la función main() tan pronto como sea posible". . ¿Qué sucede si quiero tener cuidado, o tal vez planear utilizar el ciclo de eventos en el futuro? Supongo que debería crear alguna clase de tipo Q_OBJECT y hacer mi trabajo dentro de ella, ¿cómo debería ser? – neuviemeporte

+2

Lo que debería verse va a estar influenciado por lo que quiere que haga. Si finalmente quiere hacer algo que use el ciclo de eventos, entonces use el ciclo de eventos. Dado que no has descifrado el problema que estás tratando de resolver, cualquier respuesta será enloquecedoramente zenlike en su generalidad. Es como preguntarnos cómo sería tu libro, si fueras a escribir un libro. Pero no nos dices qué tipo de libro quieres escribir. – wrosecrans

+0

Para llevar a cabo esa analogía, en el caso más general, un libro tiene una cubierta y páginas intermedias. Creo que Baysmith logró mostrar la visión general de tales portadas, así es como se ejecuta algo en el extremo del ciclo del evento. – neuviemeporte

16

No se olvide de agregar la opción

CONFIG += console 

en el archivo qmake .pro.

Para el resto solo está utilizando algunas de las clases de Qt. Una forma en que lo uso es generar procesos multiplataforma.

1

Usted puede llamar QCoreApplication :: salida (0) para salir con el código 0

4

me las arreglé para crear una consola simple "hola mundo" con Qt Creator

creador utilizado 2.4.1 y 4.8.0 del intervalo QT en Windows 7

dos maneras de hacer esto

Llanura C++

haga lo siguiente

  1. Archivo- nuevo proyecto de archivo
  2. el marco de proyectos seleccione: otro proyecto
  3. seleccione "Proyecto C++ normal"
  4. escriba el nombre del proyecto 5.Objetivos seleccione Escritorio 'garrapata es
  5. gestión de proyectos basta con hacer clic al lado
  6. se puede utilizar C++ comandos c como normales ++

o

QT consola

  1. Archivo- nuevo proyecto de archivo
  2. en proyectos seleccionar: otro Proyecto
  3. s Aplicación elegidos QT consola
  4. Objetivos seleccione Escritorio 'garrapata es
  5. gestión de proyectos basta con hacer clic al lado
  6. añadir las siguientes líneas (todo el C++ incluye lo necesario)
  7. complemento "# include 'iostream'"
  8. agregar "using namespace std; "
  9. después QCoreApplication un (int argc, argv cghar * []) ​​ 10 añadir variables y el código del programa ..

ejemplo: para la consola de QT "hola mundo"

archivo - nuevo proyecto de archivo 'nombre del proyecto'

otros proyectos - Aplicación de QT consola

Objetivos seleccione 'escritorio'

gestión de proyectos - junto

código: -R

#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 para ejecutar

compiladores utilizados para arriba MSVC 2010 (QT SDK), y MinGW (QT SDK)

esperanza esta ayuda a alguien

Como acabo de comenzar a usar QT recientemente y también busqué en la WWW información y ejemplos para comenzar con ejemplos simples que aún buscan g ...

-2

Tenía el mismo problema. encontré algunos videos en Youtube. Así que aquí hay una sugerencia aún más simple. Esto es todo el código que necesita:

#include <QDebug> 

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

El código anterior proviene de QT5 Tutorial: Creación de una sencilla aplicación de consola por

Dominique Thiebaut

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

+1

Esto no usa el ciclo de evento Qt. Es un principal desnudo de Unix(). –

Cuestiones relacionadas