Makroerweiterung in moc
-
29-09-2019 - |
Frage
würde Ich mag einige Klasse info Makro Q_CLASSINFO speichern. Allerdings möchte ich es in meinem eigenen Makro wickeln, zum Beispiel:
#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 )
}
Leider moc erweitern keine Makros so die Q_CLASSINFO hinzugefügt wird, nicht.
Ich habe mit bereits vorverarbeitet Quelle Feed moc versucht, aber es Failes auf einige enthielten Qt-Klassen.
Kennen Sie irgendeine Abhilfe für dieses?
Lösung
Andere als die eigenen Pre-moc Präprozessor rollen, nein. Das ist, was MeeGo-Touch funktioniert, zum Beispiel. Da Nokia selbst es tun, ich glaube, es gibt keinen anderen Weg.
In Ihrem Fall wäre es nur Ihre eigenen Erklärungen in Q_CLASSINFO verwickeln zu übersetzen, damit es nicht zu schwer sein sollte. Wenn Sie qmake verwenden, kann es zu der Build-Sequenz hinzugefügt werden, zu.
Andere Tipps
Die einfache Art und Weise zu machen, die moc Präprozessor modifing.
- Gehen Sie zu Qt-Quellcode qtbase / src / tools / moc z.B. (C: \ Qt \ Qt5.0.1 \ 5.0.1 \ Src \ qtbase \ src \ tools \ moc)
- Erstellen Sie eine neue Kopie von moc Projekt z.B. moc_modified
- Öffnen Sie die Kopie von moc Projekt mit QtCreator (moc.pro Datei)
- Öffnen preprocessor.cpp Datei und gehen Sie auf Symbole Preprocessor :: vorverarbeitet (const QByteArray & Dateiname, QIODevice * Datei) Funktion
-
Suchen Sie die Zeile:
// 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); ...
-
Übersetzen der neue Quellcode. Die moc ausführbare Datei erzeugt, um Ordner / sind (wenn Sie Windows in c aussehen verwenden: /bin/moc.exe)
-
Zum Qt ist (C: \ Qt \ Qt5.0.1 \ 5.0.1 \ msvc2010 \ ist) Ordner und benennen moc ausführbare Datei z moc.exe.bak
-
Kopieren neue moc ausführbare Datei Qt Binärordner.
-
In Ihrer aktuellen App benötigen Sie einen Makro zum Beispiel erstellen:
#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
ich dich Schließlich lasse meine eigenen Quellcode Funktion replaceCustomMacros:
Diese Funktion convert Q_SERVICE_INFO (Methode, Weg, Typ) Makro Q_CLASSINFO ( "srv: // Methode", "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;
}
Ich habe gefunden, keine spezifische Lösung auf Internet dann habe ich diese Lösung geschrieben.
Good Luck:)