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();
}
时间: 2024-12-25 20:50:30

Qt:解析命令行的相关文章

Qt - 解析命令行

Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数. 一.命令行写法 命令行:"-abc" 在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即"-a"."-b"和"-c" QCommandLineOption op1("a"); QCommand

Qt 解析命令行参数

#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> #include <QCommandLineParser> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QGuiApplication::setApplicationName("Qt")

Qt之命令行参数

简述 在Qt之进程间通信(QProcess)一节,我们讲解了如何通过QProcess来进行进程间的通信.主要通过启动外部程序,然后通过命令行的方式传递参数. 这里,我们可以通过Qt Creator来设置命令行参数Arguments,来设置需要用到的信息.也可以用来测试其它进程传参功能. 简述 设置参数 解析 更多参考 设置参数 选择:项目 -> 构建和运行 -> 运行,在Arguments输入框中输入需要传递的参数. 为了演示,我传递了一个Json对象:{\"UserName\&qu

python 解析命令行

原文 http://python.jobbole.com/87014 python解析命令行 2016/12/13 · 基础知识 · 命令行 分享到:0 原文出处: 顾慎为 getopt:和C中的getopt()等价.optparse:2.7后已不推荐使用.argparse:基于optparse的新库.docopt:根据文档描述,自动生成.另一份参考文档:docopt. 更详细的内容可参考上述文档. getopt 若对C的getopt()函数不熟悉,或者倾向于使用较少的代码,或者需要对帮助信息和

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

一.命令行解析 tprogram_options解析命令行参数示例代码: [cpp] view plaincopy #include <iostream> using namespace std; #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char*argv[]) { //int level; po::options_descripti

shell解析命令行的过程以及eval命令

本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name's age is $((a+4))" >/tmp/a.log 假设在执行该命令前,已赋值变量"name=longshuai"和"a=

shell如何解析命令行以及eval命令

1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name's age is $((a+4))" >/tmp/a.log 假设在执行该命令前,已赋值变量"name=longshuai"和"a=24",于是重定向到/tmp/a.log中的结果为: some files

flag 是Go 标准库提供的解析命令行参数的包QANDA.REN文库

flag flag 是Go 标准库提供的解析命令行参数的包. 使用方式: flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等:并返回一个相应类型的指针. flag.TypeVar(&flagvar, name, defValue, usage) 将flag绑定到一个变量上. 自定义flag 只要实现flag.Value接口即可: type Value interface { String() string Set(string)

用Google的gflags轻松的编码解析命令行参数

支持的参数类型 gflags支持的类型有bool,int32,int64,uint64,double和string.可以说这些基本类型大体上满足了我们的需求. DEFINE_bool: boolean DEFINE_int32: 32-bit integer DEFINE_int64: 64-bit integer DEFINE_uint64: unsigned 64-bit integer DEFINE_double: double DEFINE_string: C++ string 比如上文

ACE_Get_Opt解析命令行

ACE_Get_Opt是一种解析命令行参数选项的迭代器. 1:构造方法 ACE_Get_Opt需要引用头文件,#include "ace/Get_Opt.h". ACE_Get_Opt (int argc, ACE_TCHAR **argv, const ACE_TCHAR *optstring = ACE_TEXT (""), int skip_args = 1, int report_errors = 0, int ordering = PERMUTE_ARGS