Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)

Qt從5.2版開始提供了兩個類QCommandLineOption和QCommandLineParser來解析應用的命令行參數。spa

 

1、命令行寫法
命令行:"-abc".net

在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"code

可是因爲長命令應該是以"--"開頭,因此下面的代碼會出現異常,提示"未知的選項"blog

 

 

[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模式則是爲了兼容而存在。ip

 

2、帶值的命令文檔

命令行參數一般就分爲兩種,帶值的和不帶值的。不帶值的就直接註冊一個命令就好了,好比上面的字符串

 

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

 

咱們能夠把這個"-a"理解爲一個bool類型的命令。若是須要帶值,則把值寫在命令後面便可,值和命令之間用等號或空格隔開,字符串能夠用雙引號括起來get

-a ABC
-a=ABC

繼續看一段代碼,假設命令行爲"-a="C:/A B/Demo.exe""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.   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

相關文章
相關標籤/搜索