QCommandLineOption cannot get option

I use QCommandLineOption to parse my command line option.

this is my Arguments class:

 #include "arguments.h" #include <QDebug> /** * @brief Constructor, need to know QApplication pointer * @param app */ Arguments::Arguments(QApplication *app) { parser.setApplicationDescription("Convert html doc to pdf"); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("source", QApplication::translate("main", "Source file to copy.")); parser.addPositionalArgument("destination", QApplication::translate("main", "Destination file (ie /home/morgan/test.pdf)")); setOption(); // Process the actual command line arguments given by the user parser.process(*app); args = parser.positionalArguments(); } /** * @brief Arguments::getSource * @return QString the full path to file to be converted */ QString Arguments::getSource() { return args.isEmpty() ? QString() : args.at(0); } /** * @brief Arguments::getDest * @return QString the path to file that will be converted */ QString Arguments::getDest() { return args.isEmpty() ? QString() : args.at(1); } /** * @brief Arguments::getOrientation * @return Orientation Mode (Portrait or Landscape ?) */ QPrinter::Orientation Arguments::getOrientation() { // init orientation options values QStringList orientationOptions; orientationOptions << "portrait" << "landscape" ; // get orientation value QString orientation = parser.value("orientation").toLower(); switch (orientationOptions.indexOf(orientation)) { case 0: return QPrinter::Portrait; break; case 1: return QPrinter::Landscape; break; default: return QPrinter::Portrait; break; } } /** * @brief should print in color or not ? * @return color mode */ QPrinter::ColorMode Arguments::getColorMode() { bool gray = parser.isSet("gray"); if(gray == true) return QPrinter::GrayScale; else return QPrinter::Color; } int Arguments::getPageBegin() { QString val = parser.value("begin"); int v = val.toInt(); return v; } int Arguments::getPageEnd() { return parser.value("end").toInt(); } /** * @brief Arguments::isValidArgument * @return the app have all necesary arguments ? */ bool Arguments::isValidArgument() { if (args.size() < 2) { fprintf(stderr, "%s\n", qPrintable(QApplication::translate("main", "Error: Must specify arguments."))); parser.showHelp(1); return false; } else { return true; } } /** * @brief Add all option can be given by argument */ void Arguments::setOption() { // A String orientation mode (-o, --orientation) QCommandLineOption orientationOption(QStringList() << "o" << "orientation", QApplication::translate("main", "set orientation to Landscape or Portrait (default is Portrait)."), QApplication::translate("main", "orientation"), "Portrait"); parser.addOption(orientationOption); // print to gray mode (-g, --gray) QCommandLineOption grayOption(QStringList() << "g" << "gray", QApplication::translate("main", "should print in gray or not")); parser.addOption(grayOption); // int page start to print (-b --begin) QCommandLineOption beginOption(QStringList() << "b" << "begin", QApplication::translate("main", "number of the page where it starts to print")); parser.addOption(beginOption); QCommandLineOption endOption(QStringList() << "e" << "end", QApplication::translate("main", "number of the page where it stop to print")); parser.addOption(endOption); } 

If I use the orientation parameter (or colorMode), it works fine, but I cannot get the value of the begin parameter:

 QString val = parser.value("begin"); // return always : "" 

Usage example:

./tool http://google.com ./ --begin =5

top of page: 0
end of page: 0

./tool http://google.com ./ --begin=5

Unexpected value after '--begin'.

./tool http://google.com ./ -b 5

top of page: 0
end of page: 0

True, I do not understand why?

+5
source share
2 answers

The documentation for the QCommandLineOption constructor says:

QCommandLineOption::QCommandLineOption(const QStringList & names, const QString & description = QString(), const QString & valueName = QString(), const QString & defaultValue = QString())

[...]

In addition, the value Name can be set if the option expects a value. The default value for the parameter is set to defaultValue.

You need to pass valueName (the third argument to the constructor) to say that the parameter can have a value, and not just be a logical on / off parameter:

 QCommandLineOption beginOption(QStringList() << "b" << "begin", QApplication::translate("main", "number of the page where it starts to print"), "page", "0"); 
+5
source

Source: https://habr.com/ru/post/1200409/


All Articles