2012-08-27 12 views
9

Estoy intentando crear una aplicación de consola con Qt y he tenido un comportamiento realmente extraño al intentar recuperar los argumentos. Mi clase se deriva de QCoreApplication que tiene una función que normalmente debería poner todos los argumentos en alguna lista de strings. Pero en algunos casos esa llamada termina en una falla de segmentación.los argumentos del usuario están vacíos con QCoreApplication en casos misteriosos

Aquí está el código:

main.cpp

#include "Diagramm.h" 

int main(int argc, char *argv[]) 
{ 
    Diagramm application(argc, argv); 
    application.run(); 
    return EXIT_SUCCESS; 
} 

Diagramm.h

#include <QCoreApplication> 
#include <iostream> 
#include <QStringList> 
#include <QFile> 
#include <QDebug> 


class Diagramm : public QCoreApplication 
{ 
    Q_OBJECT 

    public: 
     Diagramm(int argc, char *argv[]); 
     void run(); 
    private: 
     void testArguments(); 
    signals: 
    public slots: 
}; 

Diagramm.cpp

#include "Diagramm.h" 

Diagramm::Diagramm(int argc, char *argv[]) : QCoreApplication(argc, argv) 
{ 
    //std::cout << "calling Diagramm constructor" << std::endl; 
} 

void Diagramm::run() 
{ 
    testArguments(); 
} 

void Diagramm::testArguments() 
{ 
    //get source and target files from arguments 
    QStringList arguments = this->arguments(); 

    if(arguments.count() < 2) 
    { 
     std::cout << "Missing arguments" << std::endl; 
     return exit(1); 
    } 
} 

Al compilar y ejecutar el código anterior, Todo funciona bien, pero cuando me elimine la línea en el constructor Diagramm 's Tengo un error de segmentación en la primera línea de la función testArguments (la llamada a arguments())

que he estado en que durante horas, la lectura de documentación de Qt, foros ... ¿Alguien sabe de dónde puede venir eso? Cualquier idea sería muy apreciada.

Nota: No estoy llamando a la función exec a propósito porque no necesito ningún bucle de evento.

Respuesta

14

Q (Core) Aplicación quiere argc y argvpor referencia, por lo que su constructor debe leer

Diagramm(int& argc, char **argv[]) 

Si no lo haces, puede funcionar en algunos casos y conducir a segfaults o comportamiento extraño en otros, como te encuentras. Parece ser un error común y no es fácil de detectar al leer la documentación.

+2

Eso fue todo. Muchas gracias ! Para otros, el código anterior debe ser: (en main.cpp) 'Aplicación Diagramm (argc, &argv);' (en Diagramm.cpp) 'Diagramm :: Diagramm (int & argc, char ** argv []): QApplication (argc, * argv) ' – Ote

0

arguments() es una función estática por lo que la línea debería ser:

QStringList arguments = QCoreApplication::arguments(); 
+1

Eso es más claro de hecho, pero por lo demás no debería hacer ninguna diferencia. –

Cuestiones relacionadas