zoukankan      html  css  js  c++  java
  • Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)

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

    一、命令行写法
    命令行:"-abc"

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

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. QCommandLineOption op1("a");  
    2. QCommandLineOption op2("b");  
    3. QCommandLineOption op3("c");  
    4.   
    5. QCommandLineParser parser;  
    6. parser.addOption(op1);  
    7. parser.addOption(op2);  
    8. parser.addOption(op3);  
    9. parser.process(a);  
    10.   
    11. qDebug() << parser.isSet(op1);  // true  
    12. qDebug() << parser.isSet(op2);  // true  
    13. qDebug() << parser.isSet(op3);  // true  

    反之,当解析模式为ParseAsLongOptions时,"-abc"会被认为是1个长命令,即"-abc"

    但是由于长命令应该是以"--"开头,所以下面的代码会出现异常,提示"未知的选项"

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. QCommandLineOption op1("a");  
    2. QCommandLineOption op2("b");  
    3. QCommandLineOption op3("c");  
    4.   
    5. QCommandLineParser parser;  
    6. parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);  
    7. parser.addOption(op1);  
    8. parser.addOption(op2);  
    9. parser.addOption(op3);  
    10. parser.process(a);  // 抛出异常,程序退出:Unknown option 'abc'.  

    Qt推荐使用ParseAsCompactedShortOptions模式,这也是默认的解析模式。而ParseAsLongOptions模式则是为了兼容而存在。

    二、带值的命令

    命令行参数通常就分为两种,带值的和不带值的。不带值的就直接注册一个命令就行了,比如上面的

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. QCommandLineOption op1("a");  

    我们可以把这个"-a"理解为一个bool类型的命令。如果需要带值,则把值写在命令后面即可,值和命令之间用等号或空格隔开,字符串可以用双引号括起来

    -a ABC
    -a=ABC

    继续看一段代码,假设命令行为"-a="C:/A B/Demo.exe""

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. int main(int argc, char *argv[])  
    2. {  
    3.   QApplication a(argc, argv);  
    4.   
    5.   // -a="C:/A B/Demo.exe"  
    6.   QCommandLineOption op1("a");  
    7.   QCommandLineParser parser;  
    8.   parser.addOption(op1);  
    9.   parser.process(a); // 异常 Unexpected value after '-a'.  
    10.   qDebug() << parser.isSet(op1);  
    11.   qDebug() << parser.value(op1);  
    12.   
    13.   MainWindow w;  
    14.   w.show();  
    15.   
    16.   return a.exec();  
    17. }  


    由于我们定义的op1并没有说明其会有参数,而实际的命令行后面跟了个参数,解析器就会报错。Qt文档中也表示,解析器不支持可选参数。
    如果需要附带参数,则必须指定一个期望值

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. int main(int argc, char *argv[])  
    2. {  
    3.   QApplication a(argc, argv);  
    4.   
    5.   // -a="C:/A B/Demo.exe"  
    6.   QCommandLineOption op1("a");  
    7.   op1.setValueName("path"); // 期望值是路径,设置了ValueName后,解析器会认为此命令带值  
    8.   QCommandLineParser parser;  
    9.   parser.addOption(op1);  
    10.   parser.process(a);  
    11.   qDebug() << parser.value(op1);// "C:/A B/Demo.exe"  
    12.   
    13.   MainWindow w;  
    14.   w.show();  
    15.   
    16.   return a.exec();  
    17. }  

    设置了ValueName后,解析器就会认为此命令带值,将会认为下一个等号或空格后的值就是参数
    这个ValueName名字随便取,只是起到一个指导性的作用。你甚至可以将它设置为"abc"

    另外,值可以有多个

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. int main(int argc, char *argv[])  
    2. {  
    3.   QApplication a(argc, argv);  
    4.   
    5.   // -a="C:/A B/Demo.exe" -a "Hello world"  
    6.   QCommandLineOption op1("a");  
    7.   op1.setValueName("test");  
    8.   Q CommandLineParser parser;  
    9.   parser.addOption(op1);  
    10.   parser.process(a);  
    11.   qDebug() << parser.values(op1);// ("C:/A B/Demo.exe", "Hello world")  
    12.   
    13.   MainWindow w;  
    14.   w.show();  
    15.   
    16.   return a.exec();  
    17. }  


    还有QCommandLineParser的addHelpOption()、addVersionOption()都是添加显示命令版本和帮助用的,一般只有命令行程序才会用到吧,就不细说了。
    解析可以用parse()方法或process()方法,前者遇到不可解析的命令会返回false但不会抛出异常,后者则会抛出异常。

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

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
      1. // -a --BBB -c -D=Jack --Age -m=Hello -m "World"  
      2. int main(int argc, char *argv[])  
      3. {  
      4.   QApplication a(argc, argv);  
      5.   
      6.   QCommandLineOption op1("a");// 短名称,无参数  
      7.   QCommandLineOption op2("BBB");// 长名称,无参数  
      8.   QCommandLineOption op3(QStringList() << "c" << "CCC");// 多个名称,无参数  
      9.   QCommandLineOption op4("D", "", "Name");// 短名称,有参数,无默认值  
      10.   QCommandLineOption op5("Age", "", "", "18");// 长名称,有参数,有默认值  
      11.   QCommandLineOption op6("m", "", "."); // 短名称,有参数,无默认值  
      12.   
      13.   QCommandLineParser parser;  
      14.   parser.addOption(op1);  
      15.   parser.addOption(op2);  
      16.   parser.addOption(op3);  
      17.   parser.addOption(op4);  
      18.   parser.addOption(op5);  
      19.   parser.addOption(op6);  
      20.   parser.process(a);  
      21.   
      22.   qDebug() << parser.isSet(op1); // true  
      23.   qDebug() << parser.isSet("BBB"); // true  
      24.   qDebug() << parser.isSet("CCC"); // true  
      25.   qDebug() << parser.value(op4); // "Jack"  
      26.   qDebug() << parser.value(op5); // "18"  
      27.   qDebug() << parser.values(op6);// ("Hello", "World")  
      28.   
      29.   qDebug() << parser.helpText();  
      30.   MainWindow w;  
      31.   w.show();  
      32.   
      33.   return a.exec();  
      34. }  

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

  • 相关阅读:
    个人项目(Word Count Java)
    自我介绍+软工5问
    第六次实践
    第五次实践作业
    第四次实践作业
    第三次实践作业
    第二次实践作业
    第1次实践作业
    第06组 Beta版本演示
    第06组 Beta冲刺(4/4)
  • 原文地址:https://www.cnblogs.com/findumars/p/6375644.html
Copyright © 2011-2022 走看看