Domanda

Mi piacerebbe memorizzare alcune informazioni classe utilizzando Q_CLASSINFO macro. Tuttavia vorrei avvolgerlo nella mia macro, ad esempio:

#define DB_TABLE( TABLE ) \
    Q_CLASSINFO( "db_table", #TABLE )

#define DB_FIELD( PROPERTY, COLUMN ) \
    Q_CLASSINFO( "dbcol_" #PROPERTY, #COLUMN )

class Foo : public QObject
{
    Q_OBJECT
    DB_TABLE( some_table )
    DB_FIELD( clientName, client_name )
}

Purtroppo, moc non si espande le macro in modo che il Q_CLASSINFO non viene aggiunto.

Ho cercato di moc mangime con fonte già pre-elaborato, ma failes su alcune classi Qt inclusi.

Sai qualsiasi soluzione per questo?

È stato utile?

Soluzione

Oltre a posizionare il proprio preprocessore pre-moc, no. Questo è ciò che fa MeeGo Touch, per esempio. Dal momento che Nokia si stanno facendo, credo che ci sia nessun altro modo.

Nel tuo caso, si tratterebbe di solo traducendo le proprie dichiarazioni in Q_CLASSINFO, quindi non dovrebbe essere troppo difficile. Se si usa qmake, può essere aggiunto alla sequenza di generazione, anche.

Altri suggerimenti

Il modo più semplice per fare che è modifing moc preprocessore.

  1. Vai al codice sorgente di Qt a qtbase / src / tools / moc per esempio (C: \ Qt \ Qt5.0.1 \ 5.0.1 \ Src \ qtbase \ src \ Tools \ moc)
  2. Crea una nuova copia del progetto di moc per esempio moc_modified
  3. Apri la copia del progetto di moc con QtCreator (file moc.pro)
  4. Apri file preprocessor.cpp e andare a Simboli preprocessore :: pre-elaborato (const QByteArray e il nome del file, QIODevice file *) la funzione
  5. Cerca la riga:

    // phase 1: get rid of backslash-newlines
    input = cleaned(input);
    
    // <- insert your code to modify input variable
    // input is a QByteArray object that contents the source code of .h file than moc is processing
    // I had created the replaceCustomMacros function, see next line
    replaceCustomMacros(input);
    ...
    
  6. Compila il nuovo codice sorgente. Il file eseguibile moc viene generato a / cartella bin (se si utilizza Windows guardare c: /bin/moc.exe)

  7. Vai a Qt bin (C: \ Qt \ Qt5.0.1 \ 5.0.1 \ msvc2010 \ bin) cartella e rinominare il file eseguibile moc per esempio moc.exe.bak

  8. Copia nuovo moc file eseguibile nella cartella bin Qt.

  9. Nella vostra applicazione corrente è necessario creare una macro, ad esempio:

    #ifndef Q_MOC_RUN
    #define DB_FIELD( PROPERTY, COLUMN )
    #endif
    
    //or in my case
    
    #ifndef Q_MOC_RUN
    #define Q_SERVICE_INFO(method, path, type)
    #endif
    

Finalmente si lascia il mio codice sorgente del replaceCustomMacros funzione:

Questa funzione di conversione Q_SERVICE_INFO (metodo, percorso, tipo) macro Q_CLASSINFO ( "SRV: // metodo", "type: path")

void Preprocessor::replaceCustomMacros(QByteArray &source)
{
    QString str(QLatin1String(source.data()));
    QString param_exp(QLatin1String("([^,\n]+)"));
    QByteArray expression("Q_SERVICE_INFO\\s*\\(");
    expression
        .append(param_exp.toLatin1())
        .append(",")
        .append(param_exp.toLatin1())
        .append("(,")
        .append(param_exp.toLatin1())
        .append(")?\\)");
    QRegExp *reg_ex = new QRegExp(QLatin1String(expression));
    int pos = -1, offset = -1, len = str.length();
    while ((offset = reg_ex->lastIndexIn(str, pos)) != -1)
    {
            reg_ex->cap(1);
            pos = -(len - offset) - 1;

            QString capturedString = reg_ex->capturedTexts().at(0);

            QString pattern = capturedString;
            pattern.remove(0, pattern.indexOf(QLatin1String("(")) + 1);
            pattern.remove(pattern.length() - 1, 1);
            QStringList params = pattern.split(QLatin1String(","));

            QString method = params.at(0).trimmed();
            method = method.mid(1, method.length() - 2);

            QString type;
            if (params.length() < 3)
            {
                type.append(QLatin1String("GET"));
            }
            else
            {
                type = params.at(2).trimmed();
                type = type.mid(1, type.length() - 2);
            }

            QString path = params.at(1).trimmed();
            path = path.mid(1, path.length() - 2);

            source.replace(offset, capturedString.length(), QString(QLatin1String("Q_CLASSINFO(\"srv://%1\",\"%2:%3\")")).arg(method, type, path).toLatin1());
    }
    delete reg_ex;

}

Non ho trovato alcuna soluzione specifica su internet poi ho postato questa soluzione.

Buona fortuna:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top