Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数。

一、命令行写法
命令行:"-abc"

在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即"-a"、"-b"和"-c"

  1. QCommandLineOption op1("a");
  2. QCommandLineOption op2("b");
  3. QCommandLineOption op3("c");
  4. QCommandLineParser parser;
  5. parser.addOption(op1);
  6. parser.addOption(op2);
  7. parser.addOption(op3);
  8. parser.process(a);
  9. qDebug() << parser.isSet(op1);  // true
  10. qDebug() << parser.isSet(op2);  // true
  11. qDebug() << parser.isSet(op3);  // true

反之,当解析模式为ParseAsLongOptions时,"-abc"会被认为是1个长命令,即"-abc"

但是由于长命令应该是以"--"开头,所以下面的代码会出现异常,提示"未知的选项"

  1. QCommandLineOption op1("a");
  2. QCommandLineOption op2("b");
  3. QCommandLineOption op3("c");
  4. QCommandLineParser parser;
  5. parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
  6. parser.addOption(op1);
  7. parser.addOption(op2);
  8. parser.addOption(op3);
  9. parser.process(a);  // 抛出异常,程序退出:Unknown option 'abc'.

Qt推荐使用ParseAsCompactedShortOptions模式,这也是默认的解析模式。而ParseAsLongOptions模式则是为了兼容而存在。

二、带值的命令

命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的

  1. QCommandLineOption op1("a");

我们可以把这个"-a"理解为一个bool类型的命令。如果需要带值,则把值写在命令后面即可,值和命令之间用等号或空格隔开,字符串可以用双引号括起来

-a ABC
-a=ABC

继续看一段代码,假设命令行为"-a="C:/A B/Demo.exe""

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. // -a="C:/A B/Demo.exe"
  5. QCommandLineOption op1("a");
  6. QCommandLineParser parser;
  7. parser.addOption(op1);
  8. parser.process(a); // 异常 Unexpected value after '-a'.
  9. qDebug() << parser.isSet(op1);
  10. qDebug() << parser.value(op1);
  11. MainWindow w;
  12. w.show();
  13. return a.exec();
  14. }

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

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. // -a="C:/A B/Demo.exe"
  5. QCommandLineOption op1("a");
  6. op1.setValueName("path"); // 期望值是路径,设置了ValueName后,解析器会认为此命令带值
  7. QCommandLineParser parser;
  8. parser.addOption(op1);
  9. parser.process(a);
  10. qDebug() << parser.value(op1);// "C:/A B/Demo.exe"
  11. MainWindow w;
  12. w.show();
  13. return a.exec();
  14. }

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

另外,值可以有多个

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. // -a="C:/A B/Demo.exe" -a "Hello world"
  5. QCommandLineOption op1("a");
  6. op1.setValueName("test");
  7. Q CommandLineParser parser;
  8. parser.addOption(op1);
  9. parser.process(a);
  10. qDebug() << parser.values(op1);// ("C:/A B/Demo.exe", "Hello world")
  11. MainWindow w;
  12. w.show();
  13. return a.exec();
  14. }

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

最后,看一个比较完整的示例

    1. // -a --BBB -c -D=Jack --Age -m=Hello -m "World"
    2. int main(int argc, char *argv[])
    3. {
    4. QApplication a(argc, argv);
    5. QCommandLineOption op1("a");// 短名称,无参数
    6. QCommandLineOption op2("BBB");// 长名称,无参数
    7. QCommandLineOption op3(QStringList() << "c" << "CCC");// 多个名称,无参数
    8. QCommandLineOption op4("D", "", "Name");// 短名称,有参数,无默认值
    9. QCommandLineOption op5("Age", "", "", "18");// 长名称,有参数,有默认值
    10. QCommandLineOption op6("m", "", "."); // 短名称,有参数,无默认值
    11. QCommandLineParser parser;
    12. parser.addOption(op1);
    13. parser.addOption(op2);
    14. parser.addOption(op3);
    15. parser.addOption(op4);
    16. parser.addOption(op5);
    17. parser.addOption(op6);
    18. parser.process(a);
    19. qDebug() << parser.isSet(op1); // true
    20. qDebug() << parser.isSet("BBB"); // true
    21. qDebug() << parser.isSet("CCC"); // true
    22. qDebug() << parser.value(op4); // "Jack"
    23. qDebug() << parser.value(op5); // "18"
    24. qDebug() << parser.values(op6);// ("Hello", "World")
    25. qDebug() << parser.helpText();
    26. MainWindow w;
    27. w.show();
    28. return a.exec();
    29. }

http://blog.csdn.net/aqtata/article/details/30485963

QT解析命令行(QCommandLineOption和QCommandLineParser类)的更多相关文章

  1. Qt 解析命令行参数

    #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> ...

  2. 使用ACE_Get_Opt解析命令行

    当我们用C++开发一些C++控制台小工具时,会需要一些用户输入的参数来决定程序如何工作和执行,而用户输入参数的方式大部分都是采用命令行参数的方式. 比如上一篇文章 玩转Windows服务系列--命令行 ...

  3. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  4. C#/.NET 使用 CommandLineParser 来标准化地解析命令行

    CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...

  5. 使用 Apache Commons CLI 解析命令行参数示例

    很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...

  6. Qt之命令行参数

    简述 在Qt之进程间通信(QProcess)一节,我们讲解了如何通过QProcess来进行进程间的通信.主要通过启动外部程序,然后通过命令行的方式传递参数. 这里,我们可以通过Qt Creator来设 ...

  7. .net core/.net 使用 CommandLineParser 来标准化地解析命令行

    CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...

  8. boost之program_options库,解析命令行参数、读取配置文件

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  9. ACE_Get_Opt解析命令行

    ACE_Get_Opt是一种解析命令行参数选项的迭代器. 1:构造方法 ACE_Get_Opt需要引用头文件,#include "ace/Get_Opt.h". ACE_Get_O ...

随机推荐

  1. 往Amazon上upload bundle经常中断的处理方法

    首先可以按如下脚本进行重复提交 #!/bin/bash ;i<=;i=i+)) do ret1=`bin/ec2-upload-bundle -b myrawbucket -m /ec2-ami ...

  2. visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  3. C++算术运算符与算术表达式

    基本的算术运算符 在本章中主要介绍算术运算符与算术表达式,赋值运算符与赋值表达式,逗号运算符与逗号表达式,其他运算符将在以后各章中陆续介绍. 常见算数运算符 运算符 说明 举例 + 加法运算符,或正值 ...

  4. BZOJ 1578: [Usaco2009 Feb]Stock Market 股票市场( 背包dp )

    我们假设每天买完第二天就卖掉( 不卖出也可以看作是卖出后再买入 ), 这样就是变成了一个完全背包问题了, 股票价格为体积, 第二天的股票价格 - 今天股票价格为价值.... 然后就一天一天dp... ...

  5. sqlplus

    以超级管理员登录 sqlplus sys/123 as sysdba 解锁用户 alter user xutianhao account unlock

  6. Python中打印列表的序号和内容

    ==>the start 最近作业里要用到遍历打印出列表中的序号和内容,我刚开始用了个很笨的方法来写,后来老师说可以使用enumerate()函数,所以我就特意研究了下. 先看我之前用的笨方法: ...

  7. 在MAC系统里添加开机启动任务(但是怎么才能知道自己程序的固定位置呢?)

    公司最近购进了几台MAC台式电脑,要在上面为一个项目做测试. MAC这么高大上的东西,还是第一次接触,折腾了半天好不容易安装了一些需要的应用服务上去,跑了一下还不错. 公司提倡节约用电,下班之后要把所 ...

  8. 关于QT的系统总结(非常全面,非常好)

    源地址:http://www.cnblogs.com/wangqiguo/p/4625611.html 阅读目录 编译环境与开发流程 QT项目的构成及原理 QT中的布局 QT中的通用控件 QVaria ...

  9. 在Android开发中,定时器一般有以下3种实现方法

    在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用H ...

  10. JAVA之等号、传类对象参数与c++的区别

    在JAVA中用等号对类对象进行赋值,实际上操作的是对象的地址. eg: package MyText; class ClassA { int value; public void seta(int v ...