1. 什么是命令行参数?
1.1 命令行参数(command-line arguments):
命令行参数就是写在命令之后的一些补充选项。命令和参数之间有空格隔开。格式一般是这样:
command parameters
执行程序时,可以从命令行传值给程序,它们对程序很重要,特别是当您想从外部控制程序时。
命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行相应的动作:
// Qt 程序代码
#include <QtCore>
#define qout qDebug()
int main(int argc, char *argv[]) {
for (int i = 0; i < argc; ++i) {
qout << i << argv[i];
}
return 0;
}
执行: |
---|
使用cmd执行命令 : CommandLineParserDemo.exe hello world |
结果如下: |
![]() |
- argc : 字符串数组的大小
- argv : 字符串数组
- argv[0] 存储程序的名称
- 多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “hello world” 内部。
1.2 参数形式
带短横线的参数就叫做选项,具体可分为两种:
1.2.1 短名称选项
短名称选项形式就是一个短横线后接一个字母。格式例如:
command -a
如果我们要一次加好几个短参数,可以用空格隔开,例如:
command -a -b -c
多个短参数也可以合并在一起,例如上面的命令等价于:
command –abc
1.2.2 长名称选项(多个字母)
长名称选项是以两个短横线–开始的。格式例如:
command --parameter
如果有多个长参数-- 只能以空格隔开写,格式例如:
command --parameter1 --parameter2
1.2.3 选项的值
有一些选项我们还可以给它赋一个值,
- 短参数赋值,通常是这样 command -p 10表示把 10 赋值给 p 参数。
- 长参数赋值,一般是这样 command --parameter=10 也是表示把10 赋值给 p 参数。
看起来长参数的方式更加容易理解,但是不如短参数那么简洁。
2. Qt解析命令行
参考:
QT解析命令行(QCommandLineOption和QCommandLineParser类) - findumars - 博客园 (cnblogs.com)
QCoreApplication提供命令行参数作为简单的字符串列表。
// Qt 程序代码
#include <QtCore>
#define qout qDebug()
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
qout << a.arguments();
}
执行 |
---|
使用cmd执行命令 : CommandLineParserDemo.exe hello world |
结果如下:![]() |
QCommandLineParser提供了定义选项,解析命令行参数、存储选项以及选项值的能力。
任何不是选项的参数(即不是以 - 开头)都存储为“位置参数”。解析器可以处理短名称选项,长名称选项,相同选项的多个名称以及选项值。
2.1 定义选项
命令行解析器会按照预先定义的选项去解析。
QcommandLineOption 类用来定义选项,QcommandLineParser 再添加选项,程序运行的时候再进行解析,比如:
#include <QtCore>
#define qout qDebug()
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QCommandLineOption op1("a");
QCommandLineParser parser;
parser.addOption(op1);
parser.process(a);
qDebug() << parser.isSet(op1); // true
}
CommandLineParserDemo.exe -a
//如果使用了其它未配置的选项,则会报错,比如:
CommandLineParserDemo.exe -ab
2.2 定义带值的选项
QCommandLineOption设置了ValueName后,解析器就会认为此命令带值,将会认为后的word就是值。
但如果选项定义了值,命令行却没有为选项赋值,则会报错。
QCommandLineOption op1("a");
op1.setValueName("value");
qDebug() << parser.value(op1); // “10”
CommandLineParserDemo.exe -a10
CommandLineParserDemo.exe -a 10 CommandLineParserDemo.exe -a=10
//短选项可以使用这3种赋值形式
另外选项值可以有多个:
QCommandLineOption op1("a");
op1.setValueName("value");
qDebug() << parser.values(op1);
CommandLineParserDemo.exe -a10 -a 20 -a=30 输出: ("10", "20", "30")
2.3 定义长名称带值的选项
#include <QtCore>
#define qout qDebug()
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QCommandLineOption op1("aa","","");
op1.setValueName("value");
QCommandLineParser parser;
parser.addOption(op1);
parser.process(a);
qDebug() << parser.values(op1);
}
// 对于长名称,传选项和值的时候,使用两个短横线就行,赋值有2种方式
CommandLineParserDemo.exe --aa 10 --aa=20
2.4 默认的-h -v 选项
关于–help 和 --version选项,Qt已经预先定义好了,可以直接使用方法即可。
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QCommandLineParser parser;
parser.addHelpOption();
parser.addVersionOption();
parser.process(a);
}
执行: |
---|
CommandLineParserDemo.exe -h |
![]() |
CommandLineParserDemo.exe -v ![]() |
2.5 完善信息
但是打印出来的程序信息不够完善,需要另外设置程序的描述和版本。
#include <QtCore>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QCoreApplication::setApplicationName("这是应用程序名称");
QCoreApplication::setApplicationVersion("1.0\nQt5.14.2 msvc2017_x86");
QCommandLineParser parser;
parser.setApplicationDescription("这是应用程序的描述");
parser.addHelpOption();
parser.addVersionOption();
QCommandLineOption opt("a","这是有值选项的描述","value");
parser.addOption(opt);
QCommandLineOption opt2("b","这是无值选项的描述");
parser.addOption(opt2);
parser.process(a);
}
运行结果: |
---|
![]() |
2.6 跑偏的参数
"positional argument"即Qt所谓的位置参数,解析器如果没有找到参数对应的选项,就把这些参数放到字符串列表中。
#include <QtCore>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QCommandLineParser parser;
QCommandLineOption opt("a");
opt.setValueName("value");
parser.addOption(opt);
parser.process(a);
qDebug() << parser.values(opt); // ("100")
qDebug() << parser.positionalArguments(); // ("10", "20")
}
CommandLineParserDemo.exe -a100 10 20
("100")
("10", "20")