24

Qt4 のコマンド ライン パーサーを探しています。

私は小さなグーグル検索を行い、これを見つけました: http://www.froglogic.com/pg?id=PublicationsFreeware&category=getoptただし、「--enable-foo」および「--disable-foo」スイッチのサポートがありません。それに加えて、それは本当の勝者のように見えます。

編集:

フロロジックがこれを削除したようです。したがって、私が見る最良のオプションは、Boost (API や ABI の安定版ではない) を使用するか、kdelibs のサポートをフォークすることです。わーい...

4

11 に答える 11

23

QCoreApplicationのコンストラクタは、require (int &argc, char **argv)(およびQApplicationから継承QCoreApplication) を必要とします。ドキュメントに記載されているように、次のことを強くお勧めします。

QApplication は一般的なコマンド ライン引数も扱うため、アプリケーション自体で解釈や変更を行う前にQApplication を作成することをお勧めします。argv

また、とにかく Qt に引数の処理で最初のパスを取得させる場合はQStringList QCoreApplication::arguments()、ウォークスルーする代わりにを使用することもお勧めしますargvQApplication独自の使用のために取得した引数の一部を削除する場合があります。

これは、他の引数解析ライブラリとの互換性にあまり適していません...

ただし、kdelibsには優れた引数パーサーが付属していますKCmdLineArgs。これは LGPL であり、KApplication必要に応じて ( に電話してKCmdLineArgs::init) なくても使用できます。

KCmdLineOptions options;
options.add("enable-foo", ki18n("enables foo"));
options.add("nodisable-foo", ki18n("disables foo"));
// double negatives are confusing, but this makes disable-foo enabled by default

KCmdLineArgs::addCmdLineOptions(options);
KApplication app;
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();

if (args->isSet("enable-foo") && !args->isSet("disable-foo"))
    cout << "foo enabled" << endl;
else
    cout << "foo disabled" << endl;

テストされていません (SO に投稿したものを誰がテストしたことがありますか?)。

于 2009-05-15T20:02:24.680 に答える
17

Qt 5.2 以降、最終的に QtCore 自体で解決策を見つけることができます。私はそこでQCommandLineParserに貢献しました。

于 2013-10-04T16:36:12.177 に答える
9

これは、エフェミエントとほぼ同じ答えですが、引数の解析に役立つ単純な正規表現を使用しています。(この方法は、少数の引数のみが必要な場合に役立ちます)

これで実行します:

./QArgTest --pid=45 --enable-foo

そしてコード:

int main(int argc, char *argv[]) {
    QApplication app(argc, argv, false);
    qDebug() << "QApp arg test app"; 

    QStringList args = app.arguments();

    int pid = 0;

    QRegExp rxArgPid("--pid=([0-9]{1,})");
    QRegExp rxArgFooEna("--enable-foo");
    QRegExp rxArgFooDis("--disable-foo");

    for (int i = 1; i < args.size(); ++i) {
        if (rxArgPid.indexIn(args.at(i)) != -1 ) {   
            pid =  rxArgPid.cap(1).toInt();
            qDebug() << i << ":" << args.at(i) << rxArgPid.cap(1) << pid;
        }
        else if (rxArgFooEna.indexIn(args.at(i)) != -1 ) {   
            qDebug() << i << ":" << args.at(i) << "Enable Foo";
        } 
        else if (rxArgFooDis.indexIn(args.at(i)) != -1 ) {   
            qDebug() << i << ":" << args.at(i) << "Disable Foo";
        } 
        else {
            qDebug() << "Uknown arg:" << args.at(i);
        }
    }
    return 0;
}
于 2010-09-21T08:58:13.920 に答える
7

http://www.libqxt.org/からQxtCommandOptionsもあります

于 2010-09-06T19:51:10.313 に答える
3

このパッケージは、 opts.addSwitch("disable-foo", &foo_disabled);を介して --disable-foo および --enable-foo をサポートしています。そしてopts.addSwitch("enable-foo", &foo_enabled); . 両方をチェックし、両方を指定する人に対処する必要があります(おっと)。

私が理解していないのは、これがどのように QT4 と関係があるかということです...

于 2009-05-15T18:59:44.347 に答える
2

それは2013年ですが、まだ「ファーストパーティ」の引数パーサーはありません。とにかく..誰かが同じ問題に直面していて、cmd パーサー ライブラリに伴う学習曲線を避けたい場合は、ここに「簡単で汚い」修正があります:-

QString QArgByKey(QString key, QChar sep = QChar('\0') ) //prototype usually in separate header

QString QArgByKey(QString key, QChar sep )
{
    bool sepd=sep!=QChar('\0');
    int pos=sepd?qApp->arguments().indexOf(QRegExp('^'+key+sep+"\\S*")):qApp->arguments().indexOf(QRegExp(key));
    return pos==-1?QString::null:
    (sepd?qApp->arguments().at(pos).split(sep).at(1):(++pos<qApp->arguments().size()?qApp->arguments().at(pos):QString::null));
}

例:-

user@box:~$ ./myApp  firstKey=Value1 --secondKey Value2 thirdKey=val3.1,val3.2,val3.3 --enable-foo

使用法:

QString param1   = QArgByKey("firstkey",'='); // Returns `Value1` from first pair
QString param2   = QArgByKey("--secondkey"); // Returns `Value2` from second pair
QString param3-1 = QArgByKey("thirdkey",'=').split(',').at(0); // Returns `val3.1`
bool fooEnabled  = qApp->arguments().contains("--enable-foo"); //To check for `--enable-foo` 

パラメータは任意の順序で渡すことができます

編集: このスニペットの更新はここにあります

于 2013-09-01T14:05:28.517 に答える
2

これを見てください:http://code.google.com/p/qtargparser/

于 2009-11-21T10:13:25.593 に答える
1

Qt4固有である必要がありますか? そうでない場合、GNU Getoptは非常に優れていますが、オープン ソース ソフトウェアを使用していない場合はライセンスが問題になる可能性があります。

于 2009-05-15T18:55:14.310 に答える
0

これを実行しようとしているときに遭遇した別のオプションも次のとおりです。

http://code.google.com/p/qgetopts/

私はそれを使用していません。

于 2010-07-16T18:48:42.353 に答える
0

また、いくつかの派手なオプションの解析については、 gperfを試すことができます。

IBM には素晴らしいチュートリアルがあります。

于 2009-11-10T13:48:17.430 に答える