bardzo prosty sposób jest skanowanie „klucz = wartość” args,
umieścić je w tabeli powiedzieć zz.map: QString -> QVariant,
i uzyskać ich wartości z zz.map.value (klucz, domyślna). Przykład:
#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
jest < 1 stronie, poniżej; to samo dla Pythona ~ 10 linii.
(Każdy ma swój ulubiony parser opcji; ten jest najprostszy.
warto powtarzać: jednak określić opcje, echo ich do plików wyjściowych -
„każdy naukowiec wiem, ma problemy z utrzymaniem toru co Parametry używali ostatnim razem pobiegli skrypt”)
TO. sprawić, że QPoints itp. działają, oczywiście, potrzebuje parsera QString -> QPoint. Ktoś wie od ręki, dlaczego to nie działa (w Qt 4.4.3)?
QPoint pt(0,0);
QDataStream s("QPoint(1,2)");
s >> pt;
qDebug() << "pt:" << pt; // QPoint(1364225897,1853106225) ??
Dodany 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
Dla tych (jak ja) wciąż na Qt4, biblioteka frologiczna może być uzyskana za pomocą maszyny internetowej Archive Wayback. Licencja na kod frologiczny jest 3-klauzulową licencją typu BSD, więc większość osób może korzystać z tego kodu. –