Qtの設定 - コマンドライン引数

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

Qt 5.2以降では、QCommandLineParserクラスとQCommandLineOptionクラスが追加され、コマンドライン引数の扱いが簡潔になっている。
また、QCoreApplicationクラスのargumentsメソッドを使用することでも、コマンドライン引数を扱うことができる。

ここでは、これらのクラスの使用方法について記載する。
併せて、デバッグ時のみ使用するコマンドライン引数の設定方法も記載する。


QCommandLineParserクラスの使用

以下の例では、QCommandLineParserクラスを継承したサブクラスを定義して、指定されたオプションを処理している。

QCommandLineParserクラスのデフォルトの動作により、例えば、--hオプションが-hオプションと同様に処理されてしまう。
この問題を解決するために、QCommandLineParserクラスのprocessメソッドをオーバーライドして、カスタムの解析ロジックを実装している。

正規表現を使用して、有効なオプション (-v, -h, -c, --version, --help, --config) のみを受け付けるようにする。
上記に存在しないオプションが指定された場合は、"不明なオプション"として処理する。

 // CustomCommandLineParser.hファイル
 
 #include <QCoreApplication>
 #include <QCommandLineParser>
 #include <QRegularExpression>
 #include <QDebug>
 
 class CustomCommandLineParser : public QCommandLineParser
 {
 public:
    void process(const QStringList &arguments)
    {
       QStringList filteredArgs;
       static QRegularExpression validOptionRegex("^(-v|-h|-c|--version|--help|--config)(?:=.*)?$");
 
       for (const QString &arg : arguments) {
          if (validOptionRegex.match(arg).hasMatch()) {
             filteredArgs << arg;
          }
          else if (arg.startsWith("-")) {
             qDebug() << "不明なオプション:" << arg;
          }
          else {
             filteredArgs << arg;
          }
       }
 
       QCommandLineParser::process(filteredArgs);
    }
 };


 // main.cppファイル
 
 #include "CustomCommandLineParser.h"
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
    QCoreApplication::setApplicationName("<任意のアプリケーション名>");
    QCoreApplication::setApplicationVersion("1.0");
 
    CustomCommandLineParser parser;
    parser.setApplicationDescription("Command line options example");
 
    QCommandLineOption versionOption(QStringList() << "v" << "version", "Displays version information.");
    parser.addOption(versionOption);
 
    QCommandLineOption helpOption(QStringList() << "h" << "help", "Displays help information.");
    parser.addOption(helpOption);
 
    QCommandLineOption configOption(QStringList() << "c" << "config", "Display the configuration string.", "config");
    parser.addOption(configOption);
 
    parser.process(QCoreApplication::arguments());

    if (parser.isSet(helpOption)) {
       parser.showHelp();
       return 0;
    }
 
    if (parser.isSet(versionOption)) {
       qDebug() << QCoreApplication::applicationName() << QCoreApplication::applicationVersion();
       return 0;
    }
 
    if (parser.isSet(configOption)) {
       QString configString = parser.value(configOption);
       qDebug() << "Configuration: " << configString;
       return 0;
    }
 
    if (parser.positionalArguments().isEmpty() && !parser.optionNames().isEmpty()) {
       qDebug() << "有効なオプションはありません。使用法については、-h または --help を使用してください。";
    }
 
    return 0;
 }


# 実行

<実行ファイル名> -h または <実行ファイル名> --help
ヘルプ情報を表示する

<実行ファイル名> -v または <実行ファイル名> --version
バージョン情報を表示する

<実行ファイル名> -c "<任意の文字列>" または <実行ファイル名> --config "<任意の文字列>"
指定された設定文字列を表示する

<実行ファイル名> -x
"不明なオプション: x" と表示する


※注意
QCommandLineParserクラスは、様々なケースに対応できるような構造になっている。

QCommandLineParserクラスの詳細は、Qt公式ドキュメントを参照すること。


また、他の使用方法については、QCommandLineParserクラスのテストケースを参照すること。



QCoreApplicationクラスを使用する方法

上記とは別の方法として、QCoreApplication::arguments()を使用することもできる。
QCoreApplication::arguments()の型はQStringListであるため、簡単に取得および加工することができる。

以下の3つの例では、全てのコマンドライン引数をQStringListクラスで取得して表示している。
コマンドライン引数の1つ目の要素を削除している理由は、1つ目の引数にはソフトウェアのパスが渡されるからである。

 // 方法 1
 QStringList argv = QCoreApplication::arguments();
 
 argv.removeAt(0);
 
 for(QString arg : argv)
 {
    qDebug() << "argument = " << arg;
 }


 // 方法 2
 QStringList argv = QCoreApplication::arguments();
 
 for(int i = 1; i < arguments.count(); i++)
 {
    qDebug() << "argument = " << arguments.at(i);
 }


 // 方法 3
 QStringList argv = QCoreApplication::arguments();
  
 argv.removeAt(0);
 foreach(QString const &arg, arguments)
 {
    qDebug() << arg;
 }



デバッグ時におけるコマンドライン引数の設定

  1. Qt Creatorを起動して、任意のQtプロジェクトを開く。
  2. Qt Creatorのメイン画面左にある[プロジェクト]アイコン - [Build & Run]セクション - [Run]項目を選択して、[実行時の設定]画面を表示する。
  3. [実行時の設定]画面から、[実行]セクション - [コマンドライン引数:]項目に、コマンドライン引数を記述する。


コマンドライン引数の記述方法は、以下の通りである。

# 各引数は半角スペースで区切る
hoge piyo fuga 

# 引数の内容に空白が入っている場合は、ダブルクォーテーション""で囲む
"hoge piyo" fuga

# 引数の内容にダブルクォーテーション""が入っている場合は、直前にエスケープシーケンスを記述する
"hoge \" piyo" fuga