Command line parser for Qt4

前端 未结 11 1736
离开以前
离开以前 2021-01-30 23:23

I am looking for a command line parser for Qt4.

I did a small google search, and found this: http://www.froglogic.com/pg?id=PublicationsFreeware&category=getopt how

11条回答
  •  礼貌的吻别
    2021-01-30 23:50

    A really simple method is to scan "key=value" args,
    put them in a table say zz.map: QString -> QVariant,
    and get their values with zz.map.value( key, default ). An example:

    #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 is < 1 page, below; same for Python ~ 10 lines.

    (Everybody has his/her favorite options parser; this one's about the simplest.
    Worth repeating: however you specify options, echo them to output files --
    "every scientist I know has trouble keeping track of what parameters they used last time they ran a script".)

    To make QPoints etc work one of course needs a QString -> QPoint parser. Anyone know offhand why this doesn't work (in Qt 4.4.3) ?

    QPoint pt(0,0);
    QDataStream s( "QPoint(1,2)" );
    s >> pt;
    qDebug() << "pt:" << pt;  // QPoint(1364225897,1853106225) ??
    

    Added 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 
    #include 
    #include 
    #include 
    
    //------------------------------------------------------------------------------
    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
    

提交回复
热议问题