Qt 解析命令行(QCommandLineOption和QCommandLineParser类)
Qt从5.2版开始提供了两个类QCmandLineOption和QCmandLineParser来解析应用的命令行参数。
一、命令行写法
命令行:"abc"
在QCmandLineParser的解析模式为ParseAsCpactedShortOptions(默认)时会被认为是3个参数,即"a"、"b"和"c"
1 QCmandLineOption op1("a"); 2 QCmandLineOption op2("b"); 3 QCmandLineOption op3("c"); 4 5 QCmandLineParser parser; 6 parser.addOption(op1); 7 parser.addOption(op2); 8 parser.addOption(op3); 9 parser.process(a); 10 11 qDebug() << parser.isSet(op1); // true 12 qDebug() << parser.isSet(op2); // true 13 qDebug() << parser.isSet(op3); // true反之,当解析模式为ParseAsLongOptions时,"abc"会被认为是1个长命令,即"abc"
但是由于长命令应该是以""开头,所以下面的代码会出现异常,提示"未知的选项"
1 QCmandLineOption op1("a"); 2 QCmandLineOption op2("b"); 3 QCmandLineOption op3("c"); 4 5 QCmandLineParser parser; 6 parser.setSingleDashWordOptionMode(QCmandLineParser::ParseAsLongOptions); 7 parser.addOption(op1); 8 parser.addOption(op2); 9 parser.addOption(op3); 10 parser.process(a); // 抛出异常,程序退出:Unknown option 'abc'.Qt推荐使用ParseAsCpactedShortOptions模式,这也是默认的解析模式。而ParseAsLongOptions模式则是为了兼容而存在。
二、带值的命令
命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的
QCmandLineOption op1("a");我们可以把这个"a"理解为一个bool类型的命令。如果需要带值,则把值写在命令后面即可,值和命令之间用等号或空格隔开,字符串可以用双引号括起来
a ABC
a=ABC
继续看一段代码,假设命令行为"a="C:/A B/Demo.exe""
由于我们定义的op1并没有说明其会有参数,而实际的命令行后面跟了个参数,解析器就会报错。Qt文档中也表示,解析器不支持可选参数。
如果需要附带参数,则必须指定一个期望值
设置了ValueName后,解析器就会认为此命令带值,将会认为下一个等号或空格后的值就是参数
这个ValueName名字随便取,只是起到一个指导性的作用。你甚至可以将它设置为"abc"
另外,值可以有多个
还有QCmandLineParser的addHelpOption()、addVersionOption()都是添加显示命令版本和帮助用的,一般只有命令行程序才会用到吧,就不细说了。
解析可以用parse()方法或process()方法,前者遇到不可解析的命令会返回false但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例
上一篇:ITK 基于C++和ITK获取3D医学图像的最大连通区域
下一篇:Qt 单例模式:本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性
Qt