2010-05-27 11 views
9

El siguiente fragmento proviene de una pequeña aplicación que escribí utilizando el marco Qt. La idea es que la aplicación se pueda ejecutar en modo por lotes (es decir, invocada por un script) o se pueda ejecutar de forma interactiva.Obtención de argumentos de línea de comando en una aplicación Qt

Es importante, por tanto, que soy capaz de analizar los argumentos de línea de comandos con el fin de conocer el modo en el que el que se ejecute etc.

[Editar]

estoy depuración utilizando Qt Creator 1.3 .1 en Ubuntu Karmic. Los argumentos se pasan de la manera normal (es decir, agregándolos a través de la configuración 'Proyecto' en el IDE de Qt Creator).

Cuando ejecuto la aplicación, parece que los argumentos no se pasan a la aplicación. El código a continuación, es un fragmento de mi función main().

int main(int argc, char *argv[]) 
{ 
    //Q_INIT_RESOURCE(application); 

    try { 
     QApplication the_app(argc, argv); 

     //trying to get the arguments into a list  
     QStringList cmdline_args = QCoreApplication::arguments(); 

     // Code continues ... 
    } 
    catch (const MyCustomException &e) { return 1; } 

    return 0; 
} 

[Actualización]

He identificado el problema - por alguna razón, aunque argc es correcta, los elementos de argv son cadenas vacías.

Puse este pequeño fragmento de código para imprimir los elementos de argv, y me horroricé al ver que estaban todos vacíos.

for (int i=0; i< argc; i++){ 
    std::string s(argv[i]); //required so I can see the damn variable in the debugger 
    std::cout << s << std::endl; 
} 

¿Alguien sabe cómo puedo recuperar los argumentos de línea de comando en mi aplicación?

+0

Tiene un refuerzo adicional en su intento/captura allí. No nos da el código para utility :: option_values ​​...¿No podrías simplificar este ejemplo para decir si cmdline_args.isEmpty() imprime "oh no!"? Si lo haces, ¿sigues teniendo el problema? – HostileFork

+0

Por cierto, ¿qué es utility :: options_values? No veo nada como eso en la documentación de Qt también. Además, incluso si no pasa argumentos, el primer argumento siempre será el nombre del programa. Entonces, creo que el problema podría estar en la utilidad :: option_values. También ha intentado comprobar argv [0], argv [1] etc ... intente con ese también ... – liaK

Respuesta

16

Si su argc y argv son buenos, me sorprende que esto sea posible ya que QApplication::arguments() es extremadamente simple. Nota the source code. Filtrando los #ifdefs para Linux, es solo:

QStringList QCoreApplication::arguments() 
{ 
    QStringList list; 
    if (!self) { 
     qWarning("QCoreApplication::arguments: Please instantiate the QApplication object first"); 
     return list; 
    } 
    const int ac = self->d_func()->argc; 
    char ** const av = self->d_func()->argv; 
    for (int a = 0; a < ac; ++a) { 
     list << QString::fromLocal8Bit(av[a]); 
    } 
    return list; 
} 

Eso es todo lo que tienes. Hay una advertencia de Unicode que no creo que se aplique a Karmic:

"En Unix, esta lista se construye a partir de los parámetros argc y argv pasados ​​al constructor en la función main(). Los datos de cadena en argv se interpreta usando QString :: fromLocal8Bit(); por lo tanto, no es posible pasar, por ejemplo, argumentos de línea de comandos japoneses en un sistema que se ejecuta en una configuración regional Latin1. La mayoría de los sistemas Unix modernos no tienen esta limitación, ya que son Unicode- basado."

Puede probar una copia de ese código contra su argc y argv directamente y ver qué pasa.

+1

+1 por señalarme en la dirección correcta. Fui engañado por que argc era el valor correcto, y no me molesté en desreferenciar argv para verificar su contenido. Puse una pequeña declaración para imprimir los argumentos a stdout y me horroricé al ver que los elementos de argv son cadenas vacías, ¿qué tipo de locura es esta? – morpheous

+1

Aceptaré esto como la respuesta correcta, ya que me puso en el camino correcto. Además, no puedo eliminar la pregunta original, ya que voté esta respuesta. El código original era incorrecto en el sentido de que debería llamar argumentos sobre la instancia de la aplicación (en lugar de la clase). No sé por qué no lo detecté antes (y nadie lo hizo). También en los argumentos de documentación hay un método estático (y se compila correctamente [extrañamente] cuando se lo llama staticall), en realidad debería invocarlo como un método de instancia (¡imagínate!). – morpheous

+1

@morpheous: no es necesario llamar a arguments() en la instancia de QCoreApplication ya que es una función estática. Sin embargo, considero que qApp-> arguemtns() es más agradable que QCoreApplication :: arguments(). – CMircea

2

Si está escribiendo una aplicación de solo consola, es posible que desee considerar el uso de QCoreApplication en lugar de QApplicition. QCoreApplication es parte de QtCore mientras que QApplication se define en QtGui, por lo que obtienes una dependencia adicional e innecesaria.

2

Sólo el fin de mantener la respuesta hasta a la fecha, Qt proporciona ahora una clase dedicada para analizar la línea de comandos:

http://doc.qt.io/qt-5/qcommandlineparser.html

P. S. : solo puede publicar esto como respuesta y no como un comentario; Lo siento porque la pregunta no era realmente cómo analizar, sino cómo acceder.

Cuestiones relacionadas