Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)
Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数。
一、命令行写法
命令行:"-abc"
在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即"-a"、"-b"和"-c"
- QCommandLineOption op1("a");
- QCommandLineOption op2("b");
- QCommandLineOption op3("c");
- QCommandLineParser parser;
- parser.addOption(op1);
- parser.addOption(op2);
- parser.addOption(op3);
- parser.process(a);
- qDebug() << parser.isSet(op1); // true
- qDebug() << parser.isSet(op2); // true
- qDebug() << parser.isSet(op3); // true
反之,当解析模式为ParseAsLongOptions时,"-abc"会被认为是1个长命令,即"-abc"
但是由于长命令应该是以"--"开头,所以下面的代码会出现异常,提示"未知的选项"
- QCommandLineOption op1("a");
- QCommandLineOption op2("b");
- QCommandLineOption op3("c");
- QCommandLineParser parser;
- parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
- parser.addOption(op1);
- parser.addOption(op2);
- parser.addOption(op3);
- parser.process(a); // 抛出异常,程序退出:Unknown option 'abc'.
Qt推荐使用ParseAsCompactedShortOptions模式,这也是默认的解析模式。而ParseAsLongOptions模式则是为了兼容而存在。
二、带值的命令
命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的
- QCommandLineOption op1("a");
我们可以把这个"-a"理解为一个bool类型的命令。如果需要带值,则把值写在命令后面即可,值和命令之间用等号或空格隔开,字符串可以用双引号括起来
-a ABC
-a=ABC
继续看一段代码,假设命令行为"-a="C:/A B/Demo.exe""
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- // -a="C:/A B/Demo.exe"
- QCommandLineOption op1("a");
- QCommandLineParser parser;
- parser.addOption(op1);
- parser.process(a); // 异常 Unexpected value after '-a'.
- qDebug() << parser.isSet(op1);
- qDebug() << parser.value(op1);
- MainWindow w;
- w.show();
- return a.exec();
- }
由于我们定义的op1并没有说明其会有参数,而实际的命令行后面跟了个参数,解析器就会报错。Qt文档中也表示,解析器不支持可选参数。
如果需要附带参数,则必须指定一个期望值
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- // -a="C:/A B/Demo.exe"
- QCommandLineOption op1("a");
- op1.setValueName("path"); // 期望值是路径,设置了ValueName后,解析器会认为此命令带值
- QCommandLineParser parser;
- parser.addOption(op1);
- parser.process(a);
- qDebug() << parser.value(op1);// "C:/A B/Demo.exe"
- MainWindow w;
- w.show();
- return a.exec();
- }
设置了ValueName后,解析器就会认为此命令带值,将会认为下一个等号或空格后的值就是参数
这个ValueName名字随便取,只是起到一个指导性的作用。你甚至可以将它设置为"abc"
另外,值可以有多个
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- // -a="C:/A B/Demo.exe" -a "Hello world"
- QCommandLineOption op1("a");
- op1.setValueName("test");
- Q CommandLineParser parser;
- parser.addOption(op1);
- parser.process(a);
- qDebug() << parser.values(op1);// ("C:/A B/Demo.exe", "Hello world")
- MainWindow w;
- w.show();
- return a.exec();
- }
还有QCommandLineParser的addHelpOption()、addVersionOption()都是添加显示命令版本和帮助用的,一般只有命令行程序才会用到吧,就不细说了。
解析可以用parse()方法或process()方法,前者遇到不可解析的命令会返回false但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例
- // -a --BBB -c -D=Jack --Age -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.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")
- qDebug() << parser.helpText();
- MainWindow w;
- w.show();
- return a.exec();
- }
http://blog.csdn.net/aqtata/article/details/30485963
Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)的更多相关文章
- QT解析命令行(QCommandLineOption和QCommandLineParser类)
Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数. 一.命令行写法命令行:"-abc" 在QComma ...
- Qt 解析命令行参数
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> ...
- 3.QT中QCommandLineParser和QCommandLineOption解析命令行参数
1 新建项目 main.cpp #include <QCoreApplication> #include <QCommandLineParser> #include & ...
- Qt:解析命令行
Qt从5.2版開始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行參数. 一.命令行写法 命令行:"-abc" 在QComm ...
- Qt之命令行参数
简述 在Qt之进程间通信(QProcess)一节,我们讲解了如何通过QProcess来进行进程间的通信.主要通过启动外部程序,然后通过命令行的方式传递参数. 这里,我们可以通过Qt Creator来设 ...
- 使用ACE_Get_Opt解析命令行
当我们用C++开发一些C++控制台小工具时,会需要一些用户输入的参数来决定程序如何工作和执行,而用户输入参数的方式大部分都是采用命令行参数的方式. 比如上一篇文章 玩转Windows服务系列--命令行 ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- ACE_Get_Opt解析命令行
ACE_Get_Opt是一种解析命令行参数选项的迭代器. 1:构造方法 ACE_Get_Opt需要引用头文件,#include "ace/Get_Opt.h". ACE_Get_O ...
- shell解析命令行的过程以及eval命令
本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e ...
随机推荐
- idea-环境配置
显示行号 Settings->Editor->Appearance标签项,勾选Show line numbers 关闭导航 在idea14版本中,上面有个代码导航,show breadcr ...
- 微信小程序预览图片
选择图片时可设置图片是否是原图,图片来源.这用的也挺常见的,比如个人中心中设置头像,可以与wx.upLoadFile()API使用 主要方法: wx.chooseImage(object) wxml ...
- 华为如何实现基于Git的跨地域协同开发
跨地域开发的需求其实由来已久,在IT/互联网发展的早期就已存在,只不过限于当时网络环境的因素,无法在线上有效的完成协同工作,所以没法实际开展.而随着近十年网络的快速发展,跨地域协同开发线变得可能而且越 ...
- gdal库中设置prj4库全路径的用法
作者:朱金灿 来源:http://blog.csdn.net/clever101 gdal库实现投影转换之类的功能实际上底层都是调用prj4库的功能.如果gdal使用非静态的方式集成prj4库,实际上 ...
- PhoneGap Html5 App 横竖屏切换自动退出
将以下内容添加到 AndroidManifest.xml 文件的 activity 标签中: android:configChanges="orientation|keyboardHidde ...
- Android中TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题
最近在使用TabHost的时候遇到了一些奇怪的问题,在这里总结分享备忘一下. 首先说一点TabActivity将会被FragmentActivity所替代,但是本文中却是使用的TabActivity. ...
- IT引导学生成长的文章链接(十二)
链接:IT学子成长指导类文章链接(1)(2)(3) (4) (5)(6)(7)(8)(9)(10)(11) "IT学子成长指导"类我收藏过的好文(十二期:至2014年4月26日) ...
- jieba(结巴)—— Python 中文分词
学术界著名的分词器: 中科院的 ICTCLAS,代码并不十分好读 哈工大的 ltp, 东北大学的 NIU Parser, 另外,中文 NLP 和英文 NLP 不太一致的地方还在于,中文首先需要分词,针 ...
- DTFT、DFT、FFT
对于一般的周期信号可以用一系列(有限个或者无穷多了)正弦波的叠加来表示.这些正弦波的频率都是某一个特定频率的倍数如5hz.2*5hz.3*5hz--(其中的 5hz 叫基频).这是傅立叶级数的思想.所 ...
- Painting and Drawing[MSDN/Windows GDI]
https://msdn.microsoft.com/en-us/library/dd162759(v=vs.85).aspx Painting and Drawing This overview d ...