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>
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> [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;
}
4 Réponses :
Si votre Argc et votre Argv sont bons, je suis surpris que cela serait possible comme C'est tout ce que vous avez. Il y a une mise en garde UNICODE que je ne pense pas s'appliquerait à Karmic: p> "sur UNIX, cette liste est construite à partir des paramètres ArgC et ARGV passés au constructeur de la fonction principale (). Le Les données de chaîne dans ARGV sont interprétées à l'aide de qstring :: Fromlocal8bit (); par exemple, il n'est pas possible de passer, par exemple, des arguments de ligne de commande japonaise sur un système qui fonctionne dans une locale Latin1. La plupart des systèmes UNIX modernes n'ont pas cette limite, Comme ils sont basés sur unicode. " i> p> Vous pouvez essayer une copie de ce code par rapport à votre argum et virgule directement et voyez ce qui se passe. p> p> qappllication :: arguments () code> est extrêmement simple. Remarque Le code source a >. Filtrer les #Ifdefs pour Linux, c'est juste:
+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?
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. P>
uniquement pour que la réponse soit à jour, QT fournit désormais une classe dédiée à la ligne de commande d'analyse: p>
http://doc.qt.io/qt-5/qcommandlineParser.html p>
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. P>
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.
Voici un exemple simple pour avoir les arguments dans une QStringlist. En supposant que vous démarrez l'application avec argument -q -t sortie est comme suit p> Vous avez maintenant les arguments en tant que QStringList. . P> et voici un code complet que j'ai écrit et utilisez dans une petite application p>
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 ..