Pregunta

Me gustaría almacenar cierta información de clase utilizando Q_CLASSINFO macro. Sin embargo, me gustaría envolver en mi propia macro, por ejemplo:

#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 )
}

Por desgracia, moc no se expande macros por lo que no se añade el Q_CLASSINFO.

He tratado de moc alimentación con la fuente ya preprocesado, pero Failes en algunas clases de Qt incluidos.

¿Conoce alguna solución para esto?

¿Fue útil?

Solución

Además de rodar su propio preprocesador pre-moc, no. Eso es lo que MeeGo táctil, por ejemplo. Desde que Nokia sí lo están haciendo, creo que no hay otra manera.

En su caso, sería solamente implica la traducción de sus propias declaraciones en Q_CLASSINFO, por lo que no debería ser demasiado difícil. Si usa qmake, se puede añadir a la secuencia de construcción, también.

Otros consejos

La forma más fácil de hacer que se modifing preprocesador moc.

  1. Ir al código fuente de Qt a qtbase / src / tools / moc por ejemplo, (C: \ Qt \ Qt5.0.1 \ 5.0.1 \ Src \ qtbase \ src \ herramientas \ MOC)
  2. Crear una nueva copia del proyecto, por ejemplo, moc moc_modified
  3. Abra la copia del proyecto moc con QtCreator (archivo moc.pro)
  4. archivo preprocessor.cpp Abrir y vaya a Símbolos preprocesador :: preprocesado (const QByteArray y el nombre de archivo, el archivo QIODevice *) , función
  5. Busca en la línea:

    // 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. compilar el código fuente nuevo. El archivo ejecutable moc se genera a / bin (si se utiliza ventanas mirar en c: /bin/moc.exe)

  7. Ir a bin Qt (C: \ Qt \ Qt5.0.1 \ 5.0.1 \ msvc2010 \ bin) carpeta y cambiar el nombre de archivo ejecutable moc por ejemplo moc.exe.bak

  8. Copiar nueva moc archivo ejecutable a la carpeta bin Qt.

  9. En su aplicación actual que necesita para crear una macro, por ejemplo:

    #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
    

Por último os dejó mi propio código fuente de replaceCustomMacros de función:

Esta función de conversión Q_SERVICE_INFO (método, trayectoria, tipo) macro a Q_CLASSINFO ( "srv: // método de", "tipo: 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;

}

No he encontrado ninguna solución específica en Internet, entonces he publicado esta solución.

Buena suerte:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top