我正在寻找一个命令行解析器的Qt4。
我在谷歌上搜索了一下,发现了这个:http://www.froglogic.com/pg?id=PublicationsFreeware&category=getopt,但是它缺乏对"--enable-foo“和"--disable-foo”开关的支持。除此之外,它看起来是一个真正的赢家。
编辑:
似乎Frologic去掉了这个。所以我看到的最好的选择是使用Boost (它既不是API也不是ABI稳定的),或者分叉对kdelibs的支持。耶..。
发布于 2013-10-05 00:36:12
从Qt5.2开始,你终于可以在QtCore中找到解决方案了:我在那里贡献了QCommandLineParser。
发布于 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的情况下使用。
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.上发布的内容?)
发布于 2010-09-21 16:58:14
这与ephemient的答案大同小异,但使用了一个简单的regexp来帮助解析参数。(如果您只需要几个参数,这种方法可能会很有用)
使用以下命令运行:
./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;
}https://stackoverflow.com/questions/870258
复制相似问题