我正在寻找Qt4的命令行解析器。
我做了一个小的谷歌搜索,发现这个:http://www.froglogic.com/pg?id=PublicationsFreeware&category=getopt但是它缺乏对“--enable-foo”和“--disable-foo”开关的支持。除此之外,它看起来像一个真正的赢家。
编辑:
似乎Frologic删除了这个。所以我看到的最佳选择是使用Boost(不是API也不是ABI稳定)或者支持kdelibs。耶...
答案 0 :(得分:23)
QCoreApplication
's constructors需要(int &argc, char **argv)
(QApplication
继承自QCoreApplication
)。作为documentation states,强烈建议
由于QApplication还处理常见的命令行参数,因此在在应用程序本身中对
argv
进行任何解释或修改之前,通常最好创建。
如果你让Qt在处理论证时获得第一遍,那么使用QStringList QCoreApplication::arguments()
而不是走过argv
也是个好主意; QApplication
可能会删除它为自己使用的一些论据。
这不适合与其他参数解析库非常兼容......
但是,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;
未经测试(谁测试过他们在S.O上发布的内容?)。
答案 1 :(得分:17)
从Qt 5.2开始,你终于可以在QtCore中找到一个解决方案:我在那里贡献了QCommandLineParser。
答案 2 :(得分:9)
这或多或少与ephemient相同,但有一个简单的正则表达式来帮助解析args。 (如果你只需要一些args,这种方式可能很有用)
运行:
./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;
}
答案 3 :(得分:7)
答案 4 :(得分:3)
该软件包支持--disable-foo和--enable-foo通过 opts.addSwitch(“disable-foo”,&amp; foo_disabled); 和 opts.addSwitch(“ enable-foo“,&amp; foo_enabled); 。您需要检查两者,并处理指定两者(oops)的人。
我不明白这与QT4有什么关系......
答案 5 :(得分:2)
一种非常简单的方法是扫描“key = value”args,
把它们放在一张表中说zz.map:QString - &gt;的QVariant,
并使用zz.map.value(键,默认值)获取它们的值。
一个例子:
#include "ztest.h"
Ztest zz;
int main( int argc, char* argv[] )
{
zz.eqargs( ++ argv ); // scan test=2 x=str ... to zz.map
QString xx = zz.map.value( "xx", "" );
if( Zint( Size, 10 )) // a #def -> zz.map.value( "Size", 10 )
...
ztest.h
是&lt; 1页,下面;同样适用于Python~10行。
(每个人都有他/她最喜欢的选项解析器;
这个是关于最简单的
值得重复:但是你指定了选项,将它们回显到输出文件 -
“我认识的每一位科学家都难以跟踪
他们上次使用什么参数运行脚本“。)
要使QPoints等工作,当然需要一个QString - &gt; QPoint解析器。 任何人都知道为什么这不起作用(在Qt 4.4.3中)?
QPoint pt(0,0);
QDataStream s( "QPoint(1,2)" );
s >> pt;
qDebug() << "pt:" << pt; // QPoint(1364225897,1853106225) ??
已添加25nov -
// ztest.h: scan args x=2 s=str ... to a key -> string table
// usage:
// Ztest ztest;
// int main( int argc, char* argv[] )
// {
// QApplication app( argc, argv );
// ztest.eqargs( ++ argv ); // scan leading args name=value ...
// int x = Zint( x, 10 ); // arg x= or default 10
// qreal ff = Zreal( ff, 3.14 );
// QString s = Zstr( s, "default" );
// care: int misspelled = Zint( misspellled ) -- you lose
//version: 2009-06-09 jun denis
#ifndef ztest_h
#define ztest_h
#include <QHash>
#include <QString>
#include <QVariant>
#include <QRegExp>
//------------------------------------------------------------------------------
class Ztest {
public:
QHash< QString, QVariant > map;
int test; // arg test=num, if( ztest.test )
Ztest() : test( 0 ) {}
QVariant val( const QString& key, const QVariant& default_ = 0 )
{
return map.value( key, default_ );
}
void setval( const QString& key, const QVariant& val )
{
map[key] = val;
if( key == "test" || key == "Test" )
test = val.toInt();
}
//------------------------------------------------------------------------------
// ztest.eqargs( ++ argv ) scans test=2 x=3 ... -> ztest table
void eqargs( char** argv )
{
char** argv0 = argv;
char *arg;
QRegExp re( "(\\w+)=(.*)" ); // name= anything, but not ./file=name
for( ; (arg = *argv) && re.exactMatch( arg ); argv ++ ){
setval( re.cap(1), re.cap(2) );
}
// change argv[0..] -> args after all name=values
while(( *argv0++ = *argv++) != 0 ) {}
}
};
extern Ztest ztest;
// macros: int x = Zint( x, 10 ): x= arg or default 10
#define Zstr( key, default ) ztest.val( #key, default ).toString()
#define Zint( key, default ) ztest.val( #key, default ).toInt()
#define Zreal( key, default ) ztest.val( #key, default ).toDouble()
#endif
答案 6 :(得分:2)
答案 7 :(得分:2)
这是2013年,仍然没有“第一方”arg解析器。无论如何..如果有人发现自己面临同样的问题,并希望避免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`
Params可以按任何顺序传递
修改:此代码段的更新将为found here
答案 8 :(得分:1)
是否必须具体针对Qt4?如果没有,GNU Getopt非常好,但如果您不使用开源软件,许可可能会成为一个问题。
答案 9 :(得分:0)
答案 10 :(得分:0)