Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数。
命令行写法
命令行:“-abc”
在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即”-a”、”-b”和”-c”
#include <QApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <QDebug>
// 执行添加的参数 -abc 或者 --abc
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QCommandLineOption op1("a");
QCommandLineOption op2("b");
QCommandLineOption op3("c");
QCommandLineOption op4("abc");
QCommandLineParser parser;
parser.addOption(op1);
parser.addOption(op2);
parser.addOption(op3);
parser.addOption(op4);
parser.process(a);
qDebug() << parser.isSet("a"); // true
qDebug() << parser.isSet("b"); // true
qDebug() << parser.isSet("c"); // true
qDebug() << parser.isSet("abc"); // false
return a.exec();
}
反之,当解析模式为ParseAsLongOptions时,”-abc”会被认为是1个长命令,即”-abc”
但是由于长命令应该是以”—“开头,所以下面的代码会出现异常,提示”未知的选项” ```cppinclude
include
include
include
// 执行添加的参数 -abc 或者 —abc int main(int argc, char* argv[]) { QApplication a(argc, argv);
QCommandLineOption op1("a");
QCommandLineOption op2("b");
QCommandLineOption op3("c");
QCommandLineOption op4("abc");
QCommandLineParser parser;
parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
parser.addOption(op1);
parser.addOption(op2);
parser.addOption(op3);
parser.addOption(op4);
parser.process(a);
qDebug() << parser.isSet("a"); // false
qDebug() << parser.isSet("b"); // false
qDebug() << parser.isSet("c"); // false
qDebug() << parser.isSet("abc"); // true
return a.exec();
}
Qt推荐使用ParseAsCompactedShortOptions模式,这也是默认的解析模式。而ParseAsLongOptions模式则是为了兼容而存在。
<a name="chlVu"></a>
## 带值的名字
命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的
```cpp
QCommandLineOption op1("a");
#include <QApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <QDebug>
// -a="param"
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QCommandLineOption op1("a");
QCommandLineParser parser;
parser.addOption(op1);
parser.process(a);
qDebug() << parser.isSet(op1); // 异常: Unexpected value after '-a'.
qDebug() << parser.value(op1);
return a.exec();
}
由于我们定义的op1并没有说明其会有参数,而实际的命令行后面跟了个参数,解析器就会报错。Qt文档中也表示,解析器不支持可选参数。
如果需要附带参数,则必须指定一个期望值:
#include <QApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <QDebug>
// -a="param"
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QCommandLineOption op1("a");
op1.setValueName("value");
QCommandLineParser parser;
parser.addOption(op1);
parser.process(a);
qDebug() << parser.isSet(op1); // true
qDebug() << parser.value(op1); // "param"
return a.exec();
}
设置了ValueName后,解析器就会认为此命令带值,将会认为下一个等号或空格后的值就是参数。这个ValueName名字随便取,只是起到一个指导性的作用。你甚至可以将它设置为”abc”。
另外,值可以有多个的时候,,会返回一个列表:(parser.values
)
#include <QApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <QDebug>
// -a "param1" -a "param2"
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QCommandLineOption op1("a");
op1.setValueName("value");
QCommandLineParser parser;
parser.addOption(op1);
parser.process(a);
qDebug() << parser.isSet(op1); // true
qDebug() << parser.values(op1); // ("param1", "param2")
return a.exec();
}
还有QCommandLineParser的addHelpOption()、addVersionOption()都是添加显示命令版本和帮助用的,一般只有命令行程序才会用到吧,就不细说了。
解析可以用parse()方法或process()方法,前者遇到不可解析的命令会返回false但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例
#include <QApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <QDebug>
// -a --BBB -CCC -Age 18 -D Jack -m hello -m world
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QCommandLineOption op1("a"); // 短名称,无参数
QCommandLineOption op2("BBB"); // 长名称,无参数
QCommandLineOption op3(QStringList({ "c", "CCC" })); // 多个名称,无参数
QCommandLineOption op4("D", "", "Name"); // 短名称,有参数,无默认值
QCommandLineOption op5("Age", "", "", "18"); // 长名称,有参数,有默认值
QCommandLineOption op6("m", "", "."); // 短名称,有参数,无默认值
QCommandLineParser parser;
parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
parser.addOption(op1);
parser.addOption(op2);
parser.addOption(op3);
parser.addOption(op4);
parser.addOption(op5);
parser.addOption(op6);
parser.process(a);
qDebug() << parser.isSet(op1); // true
qDebug() << parser.isSet("BBB"); // true
qDebug() << parser.isSet("CCC"); // true
qDebug() << parser.value(op4); // "Jack"
qDebug() << parser.value(op5); // "18"
qDebug() << parser.values(op6); // ("Hello", "World")
// "Usage: Widget.exe [options]\n\nOptions:\n -a\n --BBB\n -c, --CCC\n -D <Name>\n --Age\n -m <.>\n
qDebug() << parser.helpText();
return a.exec();
}