首页 > 其他分享 >Qt 解析命令行(QCommandLineOption和QCommandLineParser类)

Qt 解析命令行(QCommandLineOption和QCommandLineParser类)

时间:2023-07-26 13:33:46浏览次数:42  
标签:addOption op1 QCommandLineOption parser argv QCommandLineParser Qt

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

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

二、带值的命令

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

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   
 5   // -a="C:/A B/Demo.exe"  
 6   QCommandLineOption op1("a");  
 7   QCommandLineParser parser;  
 8   parser.addOption(op1);  
 9   parser.process(a); // 异常 Unexpected value after '-a'.  
10   qDebug() << parser.isSet(op1);  
11   qDebug() << parser.value(op1);  
12   
13   MainWindow w;  
14   w.show();  
15   
16   return a.exec();  
17 }  

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

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

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

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

还有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   
 6   QCommandLineOption op1("a");// 短名称,无参数  
 7   QCommandLineOption op2("BBB");// 长名称,无参数  
 8   QCommandLineOption op3(QStringList() << "c" << "CCC");// 多个名称,无参数  
 9   QCommandLineOption op4("D", "", "Name");// 短名称,有参数,无默认值  
10   QCommandLineOption op5("Age", "", "", "18");// 长名称,有参数,有默认值  
11   QCommandLineOption op6("m", "", "."); // 短名称,有参数,无默认值  
12   
13   QCommandLineParser parser;  
14   parser.addOption(op1);  
15   parser.addOption(op2);  
16   parser.addOption(op3);  
17   parser.addOption(op4);  
18   parser.addOption(op5);  
19   parser.addOption(op6);  
20   parser.process(a);  
21   
22   qDebug() << parser.isSet(op1); // true  
23   qDebug() << parser.isSet("BBB"); // true  
24   qDebug() << parser.isSet("CCC"); // true  
25   qDebug() << parser.value(op4); // "Jack"  
26   qDebug() << parser.value(op5); // "18"  
27   qDebug() << parser.values(op6);// ("Hello", "World")  
28   
29   qDebug() << parser.helpText();  
30   MainWindow w;  
31   w.show();  
32   
33   return a.exec();  
34 }  

 

标签:addOption,op1,QCommandLineOption,parser,argv,QCommandLineParser,Qt
From: https://www.cnblogs.com/ybqjymy/p/17582214.html

相关文章

  • QT jom: Makefile [debug] Error
    电脑上原本安装有QT5.15.0+VS2015+VS2008QtCreator正常使用安装vs2019后报错jom:Makefile[debug]Error1jom:Makefile[debug]Error2lnk1158:cannotrunrc.exe解决方法:找到rc.exe路径(C:\ProgramFiles(x86)\WindowsKits\8.1\bin\x64),添加到环境变量,重启QT......
  • Qt+GDAL开发笔记(一):在windows系统mingw32编译GDAL库、搭建开发环境和基础Demo
    前言  麒麟系统上做全球北斗定位终端开发,调试工具要做一个windows版本方便校对,北斗GPS发过来的是大地坐标,应用需要的是经纬度坐标,所以需要转换,可以使用公式转换,但是之前涉及到了另一个shang市公司项目使用WG,最终选择了GDAL库进行转换。注意  如果读者不强制要求ming......
  • qt 调用JAVA
    Qt调用Java的流程要实现Qt调用Java,需要经过以下步骤:步骤描述1准备Java类2在Qt中配置Java环境3创建Java对象4调用Java方法下面将详细介绍每一步需要做什么,并给出相应的代码示例。步骤一:准备Java类首先,我们需要编写一个Java类,其中包含我们想要Qt调用的......
  • Qt QTreeView实现三态复选框
    //参考:https://dgrt.cn/a/1328707.html?action=onClickvoidQtWidgetsApplication1::initTreeView(){ ui.treeView->setEditTriggers(QTreeView::NoEditTriggers); //自定义右键菜单 this->setContextMenuPolicy(Qt::CustomContextMenu); //最喜欢用的model,不喜欢自己写model......
  • Zabbix MQQT协议监控 loT设备
    一.项目背景监控异地局域网主机(主机内有物联5G卡可以单方面向特定的云服务器传输信息)这里采用zabbix5xx系列agent2-6.2版本主动模式,即客户端向服务端注册。 二.部署服务端 2.1安装docker#01安装docker#step1:安装必要的一些系统工具sudoyuminstall-y......
  • qt+opencv安装时的问题
    1、qt安装时可能无法启动,原因是缺少依赖项,执行以下指令:sudo apt-get install libxcb-xinerama0 2、qt运行时报错:GL/gl.h: No such file or directory。执行以下指令:sudo apt install mesa-common-devsudo apt install libgl1-mesa-dev 3、OpenCV编译时在执......
  • Qt打开文件夹
    QStringdirPath=QFileInfo(filepath).dir().path();//文件所在文件夹路径dirPath.replace("/","\\");//win系统下/替换成\。QProcessprocess;//启动一个program程序用后面的参数。//第一个参数是programQString类型,第二个参数是QStringList类型p......
  • QT从入门到实战完整版 P38
    手动调用绘图事件widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=nullptr);~Widget();......
  • Qt mingw73_32 + MySql8.0 使用和对数据库操作 - 初窥篇1
    1、开发环境QtCreator4.8.2+Qt5.12.2+MySql8.0.332、设计背景现在已经有MySql8.0.33是64位的数据库,仅支持64位的程序,但是当前Qt程序编译环境是mingw73_3232位程序连接64位的数据库实例3、操作流程1)测试驱动代码+测试结果intmain(inta......
  • 通信猫 共享MQTT服务器 在线客户端连接失败
    解决方法使用官方mqtt链接工具(只支持TCP协议)需要有vs2013的dll文件支持,下载连接__官方下载链接,引用自http://www.tongxinmao.com/txm/webmqtt.php正常使用ws协议端口18832连接,控制台输出如下:使用WS协议连接ws协议端口18832,链接失败使用页面客户端工具连接TCP,查看控......