Qt:解析命令行
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();
}
Qt:解析命令行的更多相关文章
- QT解析命令行(QCommandLineOption和QCommandLineParser类)
Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数. 一.命令行写法命令行:"-abc" 在QComma ...
- Qt 解析命令行参数
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> ...
- 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 ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- C#/.NET 使用 CommandLineParser 来标准化地解析命令行
CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...
随机推荐
- ctci(1)
// // main.cpp // proj1 // // Created by Yuxin Kang on 8/24/14. // Copyright (c) 2014 Yuxin Kang. Al ...
- Spring 结构
Spring框架主要由7大模块组成,它们提供了企业级开发需要的所有功能,而且每个模块都可以单独使用,也可以和其它模块组合使用,灵活且方便的部署可以使开发的程序更加简单灵活. 核心模块 Spring C ...
- Java包(package)详解
java包的作用是为了区别类名的命名空间 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用.. 2.如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包 ...
- Leetcode 363.矩形区域不超过k的最大数值和
矩形区域不超过k的最大数值和 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,-2,3]], ...
- Leetcode 337.大家结舍III
打家劫舍III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根".除了"根"之外,每栋房子有且只有 ...
- 九度oj 题目1131:合唱队形
题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们 ...
- 九度oj 题目1112:拦截导弹
题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导 ...
- spring配置mybatis3
mybatis官方网站:http://www.mybatis.org/mybatis-3/zh/configuration.html <!--第一步:加载配置数据库相关参数--> < ...
- 【bzoj4240】有趣的家庭菜园 贪心+树状数组
题目描述 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IOI草一共有N株,每个区域种植着一株.在第i个区域种 ...
- spring工作机制及为什么要用?
spring工作机制及为什么要用?1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.2.DispatcherSer ...