Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QCommandLineOption can't get option

Tags:

c++

qt

I use QCommandLineOption for parse my commande 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 orientation option (or colorMode) it's work fine but I can't get value of begin option :

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

Exemple usage :

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

page begin : 0
page end : 0

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

Unexpected value after '--begin'.

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

page begin : 0
page end : 0

Realy, I don't understand why ?

like image 782
Nymeria Avatar asked Aug 15 '14 12:08

Nymeria


2 Answers

You need to tell the option that it should expect a value.

QCommandLineOption::QCommandLineOption: In addition, the valueName can be set if the option expects a value.

QCommandLineOption::setValueName: Options without a value assigned have a boolean-like behavior: either the user specifies --option or they don't. Options with a value assigned need to set a name for the expected value, for the documentation of the option in the help output. An option with names o and output, and a value name of file will appear as -o, --output <file>.

QCommandLineOption beginOption(QStringList() << "b" << "begin", QApplication::translate("main", "number of the page where it starts to print"), "page", "0");
like image 184
thuga Avatar answered Oct 20 '22 01:10

thuga


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 valueName can be set if the option expects a value. The default value for the option is set to defaultValue.

You need to pass a valueName (the third argument to the constructor) to tell it that the option can have a value, rather than just being a boolean on/off option:

QCommandLineOption beginOption(QStringList() << "b" << "begin", QApplication::translate("main", "number of the page where it starts to print"), "page", "0");
like image 27
Oktalist Avatar answered Oct 20 '22 02:10

Oktalist