首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Qt4的命令行解析器

用于Qt4的命令行解析器
EN

Stack Overflow用户
提问于 2009-05-15 18:50:15
回答 11查看 29.4K关注 0票数 24

我正在寻找一个命令行解析器的Qt4。

我在谷歌上搜索了一下,发现了这个:http://www.froglogic.com/pg?id=PublicationsFreeware&category=getopt,但是它缺乏对"--enable-foo“和"--disable-foo”开关的支持。除此之外,它看起来是一个真正的赢家。

编辑:

似乎Frologic去掉了这个。所以我看到的最好的选择是使用Boost (它既不是API也不是ABI稳定的),或者分叉对kdelibs的支持。耶..。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-10-05 00:36:12

从Qt5.2开始,你终于可以在QtCore中找到解决方案了:我在那里贡献了QCommandLineParser

票数 17
EN

Stack Overflow用户

发布于 2009-05-15 20:02:25

QCoreApplication's constructors需要(int &argc, char **argv) ( QApplication继承自QCoreApplication)。作为documentation states,强烈建议您

由于QApplication还处理常见的命令行参数,因此在应用程序本身对argv进行任何解释或修改之前创建它通常是个好主意。

如果您让Qt获得处理参数的第一轮,那么使用QStringList QCoreApplication::arguments()而不是遍历argv也是一个好主意;QApplication可能会删除它自己使用的一些参数。

这不利于与其他参数解析库的兼容性……

但是,kdelibs提供了一个很好的参数解析器KCmdLineArgs。它是LGPL,如果你真的想要(调用KCmdLineArgs::init),它可以在没有KApplication的情况下使用。

代码语言:javascript
复制
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;

未经测试(谁会测试他们在S.O.上发布的内容?)

票数 23
EN

Stack Overflow用户

发布于 2010-09-21 16:58:14

这与ephemient的答案大同小异,但使用了一个简单的regexp来帮助解析参数。(如果您只需要几个参数,这种方法可能会很有用)

使用以下命令运行:

代码语言:javascript
复制
./QArgTest --pid=45 --enable-foo

和代码:

代码语言:javascript
复制
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;
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/870258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档