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""

1 int main(int argc, char *argv[]) 2

由于我们定义的op1并没有说明其会有参数,而实际的命令行后面跟了个参数,解析器就会报错。Qt文档中也表示,解析器不支持可选参数。
如果需要附带参数,则必须指定一个期望值

1 int main(int argc, char *argv[]) 2

设置了ValueName后,解析器就会认为此命令带值,将会认为下一个等号或空格后的值就是参数
这个ValueName名字随便取,只是起到一个指导性的作用。你甚至可以将它设置为"abc"
另外,值可以有多个

1 int main(int argc, char *argv[]) 2

还有QCmandLineParser的addHelpOption()、addVersionOption()都是添加显示命令版本和帮助用的,一般只有命令行程序才会用到吧,就不细说了。
解析可以用parse()方法或process()方法,前者遇到不可解析的命令会返回false但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例

1 // a BBB c D=Jack Age m=Hello m "World" 2 int main(int argc, char *argv[]) 3



上一篇:ITK 基于C++和ITK获取3D医学图像的最大连通区域

下一篇:Qt 单例模式:本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性


Qt
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图