QT解析命令行(QCommandLineOption和QCommandLineParser类)
2016-03-14 22:35
1171 查看
Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数。
一、命令行写法
命令行:"-abc"
在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即"-a"、"-b"和"-c"
[cpp] view plain copy
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"
但是由于长命令应该是以"--"开头,所以下面的代码会出现异常,提示"未知的选项"
[cpp] view plain copy
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模式则是为了兼容而存在。
二、带值的命令
命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的
[cpp] view plain copy
QCommandLineOption op1("a");
我们可以把这个"-a"理解为一个bool类型的命令。如果需要带值,则把值写在命令后面即可,值和命令之间用等号或空格隔开,字符串可以用双引号括起来
-a ABC
-a=ABC
继续看一段代码,假设命令行为"-a="C:/A B/Demo.exe""
[cpp] view plain copy
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文档中也表示,解析器不支持可选参数。
如果需要附带参数,则必须指定一个期望值
[cpp] view plain copy
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"
另外,值可以有多个
[cpp] view plain copy
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但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例
[cpp] view plain copy
// -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();
}
/article/2307556.html
一、命令行写法
命令行:"-abc"
在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即"-a"、"-b"和"-c"
[cpp] view plain copy
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"
但是由于长命令应该是以"--"开头,所以下面的代码会出现异常,提示"未知的选项"
[cpp] view plain copy
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模式则是为了兼容而存在。
二、带值的命令
命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的
[cpp] view plain copy
QCommandLineOption op1("a");
我们可以把这个"-a"理解为一个bool类型的命令。如果需要带值,则把值写在命令后面即可,值和命令之间用等号或空格隔开,字符串可以用双引号括起来
-a ABC
-a=ABC
继续看一段代码,假设命令行为"-a="C:/A B/Demo.exe""
[cpp] view plain copy
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文档中也表示,解析器不支持可选参数。
如果需要附带参数,则必须指定一个期望值
[cpp] view plain copy
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"
另外,值可以有多个
[cpp] view plain copy
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但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例
[cpp] view plain copy
// -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();
}
/article/2307556.html
相关文章推荐
- 配置QtCreator+CDB远程调试环境(要设置_NT_SYMBOL_PATH和QT_PLUGIN_PATH和Path)
- 让VC2012生成的程序支持XP系统(QT的DLL都是支持XP的,只与EXE有关)
- Cogs 1672. [SPOJ375 QTREE]难存的情缘 LCT,树链剖分,填坑计划
- Qt 自定义控件应用QSS(setStyleSheet)设置由Q_PROPERTY设置的属性
- 基于Jmeter的MQTT测试插件-上
- qt翻译
- Qt信号和槽问题
- QT中qmlRegisterType qmlRegisterSingletonType的区别
- VS2013配置Qt5.4
- Ubuntu 15.10下Qt5的安装实战
- Ubuntu 15.10下Qt5的安装实战
- Qt窗体内控件自适应调整大小
- Qt 如何给Widget设置背景图片
- QT编程解决Error: no such instruction: `swpb %cl,%dl,[%edi]'
- Qt5下实现摄像头预览及捕获图像方法二(openCV3与Qt5交互使用)
- QT如何设置应用程序的图标
- 不需要用任何辅助工具打包Qt应用程序
- Ubuntu14.04 LTS安装 OpenCV-3.0.0-rc1 + QT5.4.1
- Qt程序在嵌入式设备(arm) 上运行,鼠标擦除界面的解决方案
- Qt 信号和槽函数