Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)
Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数。
一、命令行写法
命令行:"-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""
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但不会抛出异常,后者则会抛出异常。
最后,看一个比较完整的示例
#include <QApplication>
#include <QCommandLineParser>
#include <QCommandLineOption>
#include<QtDebug>
//
/*
 *
 *
 -h
Options:
  -a
  --BBB
  -c, --CCC
  -D <Name>
  --Age
  -m <.>
  -?, -h, --help  Displays help on commandline options.
  --help-all      Displays help including Qt specific options.
  -v, --version   Displays version information.
  ---------------------------------------------
  -v
xxxx tools 1.0.0.0
  ---------------------------------------------
-a --BBB -c -D=Jack --Age -m=Hello -m "World"
true
true
true
"Jack"
"18"
("Hello", "World")
"Usage: ..\\myCmd.exe [options]\n\nOptions:\n  -a\n  --BBB\n  -c, --CCC\n  -D <Name>
     \n  --Age\n  -m <.>\n  -?, -h, --help  Displays help on commandline options.\n  --help-all     
 Displays help including Qt specific options.\n  -v, --version   Displays version information.\n"
  */
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setApplicationVersion("1.0.0.0");
    a.setApplicationName("xxxx tools");
    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);
    //======================================
    //添加help选项(在窗口上有-h,--help and ?),这个选项是由
    //QCommandLineParser自动自动处理的
    parser.addHelpOption();
    //添加 -v/--version选项,这个用来显示应用程序的版本信息
    //这个同样是由QCommandLineParser自动处理,同样可以通过
    //QCoreApplication::setApplicationVersion()来添加版本信息
    parser.addVersionOption();
    //======================================
    parser.process(a);
    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();
    return a.exec();
}
==========================
如何输入命令提示符,
1. 发布后用 控制台输入 程序名称后面加命令
2 调试时候在qt项目配置,


                    
                
                
            
        
浙公网安备 33010602011771号