Не парсится аргумент командной строки
Всем привет.
Пытаюсь парсить аргументы командной строки через QCommandLineParser .
Строка может принимать аргументы --alphabet , --length
Lenght парсится хорошо и выводится в консоль без проблем.

Но когда пытаюсь вывести значение аргумента --alphabet, то в консоль ничего не выводится.
Конвертирую из QString в std::string вроде правильно(если ничего не путаю).
Сам парсинг:
auto parser = parse_args(QCoreApplication(argc, argv));
auto strat = select_alphabet(*parser);
auto length = parser->value("length").toUInt();
auto alphabet = parser->value("alphabet").toUtf8().data();
cout << alphabet << endl;
Вот так добавляю опции :
QScopedPointer<QCommandLineParser> parse_args(const QCoreApplication& app) {
auto parser = new QCommandLineParser;
parser->setApplicationDescription("Password generator app.");
parser->addHelpOption();
parser->addOption({
"simple",
"Generates simple password."
});
parser->addOption({
{"medium", "m"},
"Generates medium complexity password."
});
parser->addOption({
{"strong", "s"},
"Generates most complex password."
});
parser->addOption({
{"length", "l"},
"Generates password of specified length.",
"LENGTH",
"10"
});
parser->addOption({
{"alphabet", "a"},
"Generate password with our alphabet"
});
parser->addOption({
{"from","f"},
"Generate password with our alphabet from file"
});
parser->process(app);
if (!parser->parse(QCoreApplication::arguments()))
error(parser->errorText().toLatin1().toStdString());
return QScopedPointer(parser);
}
В чем может быть проблема?
Ответы (2 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
работа с QCommandLineParser не вдаваясь в детали
QApplication a(argc, argv);
QCommandLineParser parser;
QCommandLineOption name_param(QStringList()<<"n"<<"name","Name","default-name");
QCommandLineOption port_param(QStringList()<<"p"<<"port","Port","default-port");
parser.addOption(name_param);
parser.addOption(port_param);
parser.process(a);
if(parser.isSet(name_param))
qDebug()<<"name is " << parser.value(name_param);
if(parser.isSet(port_param))
qDebug()<<"port is " << parser.value(port_param);
Касаемо вашего случая
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QCommandLineParser parser;
QCommandLineOption opt_simple(QStringList()<<"s"<<"simple","Generates simple password."); // опция не требует значения
QCommandLineOption opt_medium(QStringList()<<"m"<<"medium","Generates medium complexity password.");
QCommandLineOption opt_strong(QStringList()<<"S"<<"strong","Generates most complex password.");
QCommandLineOption opt_alphabet(QStringList()<<"a"<<"alphabet","Generate password with our alphabet");
QCommandLineOption opt_from(QStringList()<<"f"<<"from","Generate password with our alphabet from file.","FILE","");
QCommandLineOption opt_length(QStringList()<<"l"<<"length","Generates password of specified length.","LENGTH","10"); // значение по умолчанию 10
parser.addOption(opt_simple);
parser.addOption(opt_medium);
parser.addOption(opt_strong);
parser.addOption(opt_alphabet);
parser.addOption(opt_from);
parser.addOption(opt_length);
parser.addHelpOption(); // добавим опцию помощи (--help выведет помощь по использованию и завершит приложение)
parser.process(a);
// Переберем все опции, которые переданы в командной строке
foreach(QString opt,parser.optionNames()){
qDebug()<<opt<<" was set with value "<<parser.value(opt); // выведем название опции и значение (если его нет, будет "")
}
if(!parser.isSet("s")&&!parser.isSet("m")&&!parser.isSet("S")){ // проверим что была установлена хотябы одна опция режима
qDebug()<<"mode was not set";
}
return 0;
}
Автор решения: Arcanecliff
→ Ссылка
Проблему решил. Добавить параметр "TEXT" в
parser->addOption({
{"alphabet", "a"},
"Generate password with our alphabet"
});
Верный вариант :
parser->addOption({
{"alphabet", "a"},
"Generate password with our alphabet",
"TEXT"
});
