QCommandLine

来源:互联网 发布:网络歌手樊棋照片 编辑:程序博客网 时间:2024/05/16 18:56

转载:
http://blog.csdn.net/aqtata/article/details/30485963

Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数。

/*

QCommandLineOption(const QString &name, const QString &description, const QString &valueName = QString(), const QString &defaultValue = QString())

QCommandLineOption(const QStringList &names, const QString &description, const QString &valueName = QString(), const QString &defaultValue = QString())

*/
一、命令行写法
命令行:”-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""[cpp] view plain copy 在CODE上查看代码片派生到我的代码片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);    if( parser.unknownOptionNames().isEmpty() )    {        puts("Error Args,please use -h option for a help.");        return 1;    }  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();  }  

#include <QCoreApplication>#include <QCommandLineParser>#include <QDebug>#include <stdio.h>int main(int argc, char** argv){    QCoreApplication app(argc, argv);    app.setApplicationVersion("1.0.0.0");    app.setApplicationName("xxxx tools");    /* QCommandLineParser是提供了一系列命令行参数的类*/    QCommandLineParser parser;    //添加help选项(在窗口上有-h,--help and ?),这个选项是由    //QCommandLineParser自动自动处理的    parser.addHelpOption();    //添加 -v/--version选项,这个用来显示应用程序的版本信息    //这个同样是由QCommandLineParser自动处理,同样可以通过    //QCoreApplication::setApplicationVersion()来添加版本信息    parser.addVersionOption();    //通过QCommandLineOption类定义可能的命令行选项    QCommandLineOption p(QStringList() << "p" << "package", "set package name of Android", "com.itcast.hello");    parser.addOption(p);    QCommandLineOption l(QStringList() << "l" << "language", "set code language c++ or lua", "c++");    parser.addOption(l);    //通过app.arguments()返回一系列的命令行参数    //parser.parse(app.arguments());    parser.process(app);    //通过parser来解析一系列命令行参数    QString strValue = parser.value("p");    //qCritical() << "p is" << strValue;    //打印出解析出来的命令行参数    printf("p is %s\n",strValue.toUtf8().data());    //表示的是language    strValue = parser.value("l");    //未定义的参数,即选项之外的参数    qDebug() << parser.positionalArguments();    return 0;    // return app.exec();}
0 0