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

命令行写法

命令行:“-abc”

  • 在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即”-a”、”-b”和”-c”

    1. #include <QApplication>
    2. #include <QCommandLineOption>
    3. #include <QCommandLineParser>
    4. #include <QDebug>
    5. // 执行添加的参数 -abc 或者 --abc
    6. int main(int argc, char* argv[])
    7. {
    8. QApplication a(argc, argv);
    9. QCommandLineOption op1("a");
    10. QCommandLineOption op2("b");
    11. QCommandLineOption op3("c");
    12. QCommandLineOption op4("abc");
    13. QCommandLineParser parser;
    14. parser.addOption(op1);
    15. parser.addOption(op2);
    16. parser.addOption(op3);
    17. parser.addOption(op4);
    18. parser.process(a);
    19. qDebug() << parser.isSet("a"); // true
    20. qDebug() << parser.isSet("b"); // true
    21. qDebug() << parser.isSet("c"); // true
    22. qDebug() << parser.isSet("abc"); // false
    23. return a.exec();
    24. }

    反之,当解析模式为ParseAsLongOptions时,”-abc”会被认为是1个长命令,即”-abc”
    但是由于长命令应该是以”—“开头,所以下面的代码会出现异常,提示”未知的选项” ```cpp

    include

    include

    include

    include

// 执行添加的参数 -abc 或者 —abc int main(int argc, char* argv[]) { QApplication a(argc, argv);

  1. QCommandLineOption op1("a");
  2. QCommandLineOption op2("b");
  3. QCommandLineOption op3("c");
  4. QCommandLineOption op4("abc");
  5. QCommandLineParser parser;
  6. parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
  7. parser.addOption(op1);
  8. parser.addOption(op2);
  9. parser.addOption(op3);
  10. parser.addOption(op4);
  11. parser.process(a);
  12. qDebug() << parser.isSet("a"); // false
  13. qDebug() << parser.isSet("b"); // false
  14. qDebug() << parser.isSet("c"); // false
  15. qDebug() << parser.isSet("abc"); // true
  16. return a.exec();

}

  1. Qt推荐使用ParseAsCompactedShortOptions模式,这也是默认的解析模式。而ParseAsLongOptions模式则是为了兼容而存在。
  2. <a name="chlVu"></a>
  3. ## 带值的名字
  4. 命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的
  5. ```cpp
  6. QCommandLineOption op1("a");
  1. #include <QApplication>
  2. #include <QCommandLineOption>
  3. #include <QCommandLineParser>
  4. #include <QDebug>
  5. // -a="param"
  6. int main(int argc, char* argv[])
  7. {
  8. QApplication a(argc, argv);
  9. QCommandLineOption op1("a");
  10. QCommandLineParser parser;
  11. parser.addOption(op1);
  12. parser.process(a);
  13. qDebug() << parser.isSet(op1); // 异常: Unexpected value after '-a'.
  14. qDebug() << parser.value(op1);
  15. return a.exec();
  16. }

由于我们定义的op1并没有说明其会有参数,而实际的命令行后面跟了个参数,解析器就会报错。Qt文档中也表示,解析器不支持可选参数。

如果需要附带参数,则必须指定一个期望值:

  1. #include <QApplication>
  2. #include <QCommandLineOption>
  3. #include <QCommandLineParser>
  4. #include <QDebug>
  5. // -a="param"
  6. int main(int argc, char* argv[])
  7. {
  8. QApplication a(argc, argv);
  9. QCommandLineOption op1("a");
  10. op1.setValueName("value");
  11. QCommandLineParser parser;
  12. parser.addOption(op1);
  13. parser.process(a);
  14. qDebug() << parser.isSet(op1); // true
  15. qDebug() << parser.value(op1); // "param"
  16. return a.exec();
  17. }

设置了ValueName后,解析器就会认为此命令带值,将会认为下一个等号或空格后的值就是参数。这个ValueName名字随便取,只是起到一个指导性的作用。你甚至可以将它设置为”abc”。
另外,值可以有多个的时候,,会返回一个列表:(parser.values)

  1. #include <QApplication>
  2. #include <QCommandLineOption>
  3. #include <QCommandLineParser>
  4. #include <QDebug>
  5. // -a "param1" -a "param2"
  6. int main(int argc, char* argv[])
  7. {
  8. QApplication a(argc, argv);
  9. QCommandLineOption op1("a");
  10. op1.setValueName("value");
  11. QCommandLineParser parser;
  12. parser.addOption(op1);
  13. parser.process(a);
  14. qDebug() << parser.isSet(op1); // true
  15. qDebug() << parser.values(op1); // ("param1", "param2")
  16. return a.exec();
  17. }

还有QCommandLineParser的addHelpOption()、addVersionOption()都是添加显示命令版本和帮助用的,一般只有命令行程序才会用到吧,就不细说了。

解析可以用parse()方法或process()方法,前者遇到不可解析的命令会返回false但不会抛出异常,后者则会抛出异常。

最后,看一个比较完整的示例

  1. #include <QApplication>
  2. #include <QCommandLineOption>
  3. #include <QCommandLineParser>
  4. #include <QDebug>
  5. // -a --BBB -CCC -Age 18 -D Jack -m hello -m world
  6. int main(int argc, char* argv[])
  7. {
  8. QApplication a(argc, argv);
  9. QCommandLineOption op1("a"); // 短名称,无参数
  10. QCommandLineOption op2("BBB"); // 长名称,无参数
  11. QCommandLineOption op3(QStringList({ "c", "CCC" })); // 多个名称,无参数
  12. QCommandLineOption op4("D", "", "Name"); // 短名称,有参数,无默认值
  13. QCommandLineOption op5("Age", "", "", "18"); // 长名称,有参数,有默认值
  14. QCommandLineOption op6("m", "", "."); // 短名称,有参数,无默认值
  15. QCommandLineParser parser;
  16. parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
  17. parser.addOption(op1);
  18. parser.addOption(op2);
  19. parser.addOption(op3);
  20. parser.addOption(op4);
  21. parser.addOption(op5);
  22. parser.addOption(op6);
  23. parser.process(a);
  24. qDebug() << parser.isSet(op1); // true
  25. qDebug() << parser.isSet("BBB"); // true
  26. qDebug() << parser.isSet("CCC"); // true
  27. qDebug() << parser.value(op4); // "Jack"
  28. qDebug() << parser.value(op5); // "18"
  29. qDebug() << parser.values(op6); // ("Hello", "World")
  30. // "Usage: Widget.exe [options]\n\nOptions:\n -a\n --BBB\n -c, --CCC\n -D <Name>\n --Age\n -m <.>\n
  31. qDebug() << parser.helpText();
  32. return a.exec();
  33. }