配置QT程序的命令行参数
原文链接:https://blog.csdn.net/yang1fei2/article/details/125245613
在开发一些非UI程序的时候,我们习惯通过命令行参数给程序传递一些配置项和参数。这时候在程序里面解析这些配置项和参数就成了一个让人头疼的问题。其实针对QT命令行参数的解析,QT提供了现成的工具类QCommandLineParser,通过使用工具类可以极大的简化我们解析命令行参数的工作量。这里介绍一下命令行参数解析类的使用方法。
获取程序的版本信息
对于一些通用产品,比如git或者electron等等我们都可以通过命令参数-v或者–version获取程序的版本号,QT默认也是支持的,调用方法如下:
void commandLineInterface(QCoreApplication& app)
{
//设置应用程序的名称和版本号
QCoreApplication::setApplicationName("commandline-parser");
QCoreApplication::setApplicationVersion("1.0");
QCommandLineParser parser;
//添加对应的版本配置
parser.addVersionOption();
parser.process(app);
}
int main(int argc,char*argv[])
{
QCoreApplication app(argc, argv);
commandLineInterface(app);
return app.exec();
}
使用效果如下:
>commandline.exe -v
commandline-parser 1.0
>commandline.exe --version
commandline-parser 1.0
添加新的配置项
命令行识别的配置项都是以 - 或者 – 开头的。
短配置就是单个字母的配置使用引导符号-,比如配置v命令终端的调用方式就是-v。在默认配置下QCommandLineParser支持组合配置模式,在组合配置模式下-abc等价于-a -b -c。如果设置了ParserAsLongOptions选项,-abc才会被解析成abc配置。
长配置就是不止一个字母的配置,长配置不可以采用组合配置模式。在默认配置下,长配置需使用–符号作为引导符。比如version的命令行传递方式为–version。
给配置项传递值可以使用赋值操作符,调用方法如下:
-v=value --version=value
配置项后面的参数会被用作配置项的值,即使这个值是以-开头的。
如果配置项被设置成需要传递参数的话,我们必须给这个配置传递一个值,如果该配置放在命令行的结束的位置,之后没有参数, 那么这个需要参数的配置项会被废弃,从而不起作用。
下面介绍一下各种类型的配置项的使用方法:
void commandLineInterface(QCoreApplication& app)
{
//设置应用程序的名称和版本号
QCoreApplication::setApplicationName("commandline-parser");
QCoreApplication::setApplicationVersion("1.0");
QCommandLineParser parser;
//添加对应的版本配置
parser.addVersionOption();
parser.addHelpOption();
//不带参数的短配置/长配置,参数二是描述信息
QCommandLineOption noValueShortOption("u","shortOption");
QCommandLineOption noValueLongOption("url","longOption");
parser.addOption(noValueShortOption);
parser.addOption(noValueLongOption);
//有多个名称的不带参数的配置
QCommandLineOption noValueOption(QStringList() << "f" << "file","multinameOption");
parser.addOption(noValueOption);
//有多个名称的带参数的配置
//@1:配置的名称 @2:配置的描述 @3:配置值在帮助菜单里面的描述 @4:参数的默认值(可以不指定)
//默认值就是在终端不指定配置的时候配置默认的值
QCommandLineOption hasValueMultinameOption(QStringList() << "p" << "path","multinameValueOption","mypath","C:\\hello.log");
parser.addOption(hasValueMultinameOption);
parser.process(app);
qDebug() << "option-u:" << parser.isSet("u");
qDebug() << "option-url:" <<parser.isSet("url");
qDebug() << "option-f:" <<parser.isSet("f");
qDebug() << "option-f:" <<parser.isSet("file");
if(parser.isSet("p") || parser.isSet("path"))
{
qDebug() << "option-p:" << parser.value("p");
}
else
{
qDebug() << parser.value("p");
}
}
int main(int argc,char*argv[])
{
QCoreApplication app(argc, argv);
commandLineInterface(app);
return app.exec();
}
有时候,配置项目可能有很多,我们记不住,这时候我们可以在命令行解析类里面添加帮助配置parser.addHelpOption();我们就可以在终端通过-h或者–help查看配置的帮助菜单了,显示效果如下:
>commandline.exe -h
Usage: commandline.exe [options]
Options:
-v, --version Displays version information.
-?, -h, --help Displays this help.
-u shortOption
--url longOption
-f, --file multinameOption
-p, --path <mypath> multinameValueOption
如果项目支持C++11的话,我们可以以一种更加简洁的Json结构初始化配置项:
//解析命令行参数
void commandLineJson(QCoreApplication& app)
{
//设置应用程序的名称和版本号
QCoreApplication::setApplicationName("commandline-parser");
QCoreApplication::setApplicationVersion("1.0");
QCommandLineParser parser;
parser.setApplicationDescription("line helper");
parser.addHelpOption();
parser.addVersionOption();
//添加单一带参数的单一配置
//@1:配置的名称 @2:配置的描述 @3:配置值在帮助菜单里面的描述 @4:参数的默认值(可以不指定)
//默认值就是在终端不指定配置的时候配置默认的值
parser.addOption({{"d","dir"},"set log output dir","filedir","C:\\"});
//添加不带参数的配置
parser.addOption({"u","shortoption"});
parser.addOption({"url","longoption"});
//添加多个配置项
parser.addOptions({
{"debug",
"Enable the debug mode."},
{{"f", "file"},
"Write the logs into <file>.",
"logfile"},
{{"l", "level"},
"Restrict the logs to level <level>. Default is 'fatal'.",
"level",
"fatal"},
});
parser.process(app);
}
位置参数
我们可以通过addPositionalArgument接口给应用程序定义额外的位置参数,并且这些参数可以通过-h/–help菜单文档进行显示。位置参数在命令行的调用过程中不能以-或者–开头。位置参数的使用方法如下所示:
//解析命令行参数
void commandPosArgument(QCoreApplication& app)
{
//设置应用程序的名称和版本号
QCoreApplication::setApplicationName("commandline-parser");
QCoreApplication::setApplicationVersion("1.0");
QCommandLineParser parser;
parser.setApplicationDescription("line helper");
parser.addHelpOption();
parser.addVersionOption();
parser.addOption({{"d","dir"},"set log output dir","filedir","C:\\"});
//@1:位置参数 @2:参数的描述 @3:参数的调用格式
//位置参数在命令行调用的时候不能以-开头
parser.addPositionalArgument("url","visit url addr","[url ...]");
parser.process(app);
QStringList positionList = parser.positionalArguments();
qDebug() << positionList;
}
int main(int argc,char*argv[])
{
QCoreApplication app(argc, argv);
commandPosArgument(app);
return app.exec();
}
在–help菜单中位置参数的显示内容如下:
>commandline.exe -h
Usage: commandline.exe [options] [url ...]
line helper
Options:
-?, -h, --help Displays this help.
-v, --version Displays version information.
-d, --dir <filedir> set log output dir
Arguments:
url visit url addr
注意:addPositionalArgument只是在help菜单中添加了位置参数的描述信息,在真正使用的过程中,命令行参数中所有option使用不到的,不以-或者–开头的参数都会被认定为是位置参数。通过positionalArguments()可以获得所有的位置参数的列表。如果想使用以-或者–开头的额外参数,需要在调用的时候前面追加一个–
//在这种情况下--opt和-t会被认定为位置参数
commandline.exe url -- --opt -t
如果不想通过–来确定位置参数,我们还可以在parser参数之前追加一个配置,这样解析以-开头的位置参数的时候,就不需要追加–符号了。
void commandPosArgument(QCoreApplication& app)
{
//修改解析模式,这样以-或者--开头的参数也会被认定为位置参数
parser.setOptionsAfterPositionalArgumentsMode(QCommandLineParser::ParseAsPositionalArguments);
parser.process(app);
QStringList positionList = parser.positionalArguments();
}