gpt4 book ai didi

qt - moc 中的宏扩展

转载 作者:行者123 更新时间:2023-12-02 13:40:39 25 4
gpt4 key购买 nike

我想使用 Q_CLASSINFO 宏存储一些类信息。但是我想将它包装在我自己的宏中,例如:

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

不幸的是,moc 不会扩展宏,因此不会添加 Q_CLASSINFO。

我尝试为 moc 提供已预处理的源代码,但在某些包含的 Qt 类上失败。

您知道解决此问题的方法吗?

最佳答案

实现这一点的简单方法是修改 moc 预处理器。

  1. 转到 Qt 源代码 qtbase/src/tools/moc,例如(C:\Qt\Qt5.0.1\5.0.1\Src\qtbase\src\tools\moc)
  2. 创建 moc 项目的新副本,例如moc_修改
  3. 使用 QtCreator 打开 moc 项目的副本(moc.pro 文件)
  4. 打开 preprocessor.cpp 文件并转到 Symbols Preprocessor::preprocessed(const QByteArray &filename, QIODevice *file) 函数
  5. 搜索行:

    // 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. 编译新的源代码。 moc可执行文件生成到/bin文件夹(如果使用windows查看c:/bin/moc.exe)

  7. 转到 Qt bin (C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin) 文件夹并重命名 moc 可执行文件,例如moc.exe.bak

  8. 将新的 moc 可执行文件复制到 Qt bin 文件夹。

  9. 在您当前的应用程序中,您需要创建一个宏,例如:

    #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

最后我给大家分享一下我自己的函数replaceCustomMacros的源代码:

此函数将 Q_SERVICE_INFO(method, path, type) 宏转换为 Q_CLASSINFO("srv://method", "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;

}

我在互联网上没有找到任何具体的解决方案,所以我发布了这个解决方案。

祝你好运:)

关于qt - moc 中的宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com