11
votes

Obtention d'arguments de ligne de commande dans une application QT

L'extrait suivant provient d'une petite application que j'ai écrite à l'aide du cadre QT. L'idée est que l'application peut être exécutée en mode batch (c'est-à-dire appelée par un script) ou peut être exécutée de manière interactive.

Il est donc important que je puisse analyser les arguments de ligne de commande afin de savoir quel mode dans lequel exécuter etc. p>

[modifier] p> p> p> P> P>

Je débogage à l'aide de QT Creator 1.3.1 sur Ubuntu Karmic. Les arguments sont passés de manière normale (c'est-à-dire en les ajoutant via les paramètres de «projet» dans l'IDE QT Creator). P>

Lorsque j'exécute l'application, il apparaît que les arguments ne sont pas transmis à l'application. Le code ci-dessous est un extrait de ma fonction principale (). p> xxx pré>

[update] strong> p>

J'ai identifié le problème - pour une raison quelconque, bien que l'argc soit correct, les éléments de argv sont des chaînes vides. p>

Je mets ce petit extrait de code pour imprimer les articles Argv - et a été horrifié pour voir qu'ils étaient tous vides. P>

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;
}


2 commentaires

Vous avez une attelle supplémentaire sur votre try / attraper là-bas. Vous ne nous donnez pas le code de l'utilité :: option_values ​​... ne pouviez-vous pas simplifier cet exemple à dire si cmdline_args.Impty () Imprimer "Oh non!"? Si vous le faites, avez-vous toujours le problème?


Au fait, qu'est-ce que l'utilité :: options_values? Je ne vois rien de comme ça dans la documentation QT aussi. Également même si vous ne passez pas d'arguments, le premier argument sera toujours le nom du programme. Je pense donc que le problème pourrait être dans l'utilité :: option_values. Avez-vous également essayé de vérifier argv [0], argv [1], etc. Essayez celui-là aussi ..


4 Réponses :


17
votes

4 commentaires

+1 pour me pointer dans la bonne direction. J'étais induit en erreur par ARGC étant la valeur correcte et je n'ai pas pris la peine de discuter de la déréence argov pour vérifier son contenu. J'ai mis une petite déclaration pour imprimer les arguments à STDOUT et j'ai été horrifié de voir que les éléments de l'ARGV sont des cordes vides - quelle sorte de folie est-ce?!


J'accepterai cela comme la réponse correcte depuis que cela m'a commencé sur la bonne voie - aussi, je ne peux pas supprimer la question initiale, puisque j'ai voté cette réponse. Le code d'origine était faux dans lequel je devrais appeler des arguments sur l'instance de l'application (plutôt que la classe) - je ne sais pas pourquoi je n'ai pas tapé cela plus tôt (et personne ne l'a fait non plus). De plus, dans la documentation, les arguments sont une méthode statique (et compile correctement [bizarlys] lorsqu'il est appelé staticall), dans la réalité, je devrais l'appeler comme une méthode d'instance (Figure!).


@Morpheous: il n'est pas nécessaire d'appeler des arguments () sur l'instance de QcoreApplication car c'est une fonction statique. Cependant, je trouve Qapp-> arguemtns () d'être plus agréable que QcoreApplication :: Arguments ().


Comme indice Iconik, il ne devrait pas faire une différence statique ou une instance. (Remarque Il utilise "Self" et non "Ceci" ... Self est une macro Qt pour traiter des classes mono-instances.) Quant à votre argument vide lorsque Argc est non nul ... euh, wtf? Est argv [argc] null?



4
votes

Si vous écrivez une application de console uniquement, vous voudrez peut-être envisager d'utiliser QcoreApplication au lieu de qapplicition. QCoreApplication fait partie de QTcore tandis que QApplication est définie dans QTGUI, vous obtenez donc une dépendance supplémentaire et inutile.


0 commentaires

4
votes

uniquement pour que la réponse soit à jour, QT fournit désormais une classe dédiée à la ligne de commande d'analyse:

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

P.s. : ne peut poster que cela comme réponse et pas un commentaire; Je suis désolé parce que la question n'était pas vraiment comment analyser, mais comment accéder.


1 commentaires

C'est certainement ce que devrait être la réponse acceptée. Tout le monde peut analyser ses propres arguments, j'ai réellement écrit une telle bibliothèque: advgeopt . Mais si vous écrivez une application QT, vous devriez vraiment utiliser les classes QT. Cela le rend beaucoup plus facile.



0
votes

Voici un exemple simple pour avoir les arguments dans une QStringlist. En supposant que vous démarrez l'application avec argument -q -t xxx

sortie est comme suit xxx

Vous avez maintenant les arguments en tant que QStringList. .

et voici un code complet que j'ai écrit et utilisez dans une petite application xxx


0 commentaires