是否有可能重用 c++ QML 中的用户定义宏/函数或直接在 QML 中具有类似的定义

发布于 2025-01-11 13:43:37 字数 548 浏览 0 评论 0原文

我有一个在 C++ 中定义的函数宏,如下所示,这里的好处是标识符 __PRETTY_FUNCTION__ 自动添加到最终调用中,从而捕获原始调用者签名,我也需要这种情况我从 QML 调用最终函数而不手动添加调用者 prety_type ,我无法定义从 QML 调用的 Q_INVOKABE 但如果 invoKable 采用调用宏的规则,我将丢失 QML 调用者函数签名,我知道这应该是可能的,因为 splodg 库具有显示 QML/JS 函数名称的行为。

#define my_debug(msg,category) \
    myns::logger->log_debug(msg, category,  __PRETTY_FUNCTION__)

在 C++ 中,

namespace myns{
class logger {
void log_debug(const char* msg , CATEGORY category  , const char* caller_sign = ""){
 ... 
  ...
}
}
}

I have a function macro defined in c++ like below, the benefit here is that the identifier __PRETTY_FUNCTION__, is automatically added to the final call thus original caller signature is captured, I need this also to be the case when I call my final function from QML without manually adding caller prety_type , I cant define a Q_INVOKABE called from QML but if the invoKable takes the rule of invoking the macro I would lost QML caller function signature , I know it should be possible because splodg library has this behavior of showing QML/JS function name .

#define my_debug(msg,category) \
    myns::logger->log_debug(msg, category,  __PRETTY_FUNCTION__)

in c++ ,

namespace myns{
class logger {
void log_debug(const char* msg , CATEGORY category  , const char* caller_sign = ""){
 ... 
  ...
}
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

痴意少年 2025-01-18 13:43:37

无法直接从 QML 调用宏。那是不可能的。但听起来这不是你真正的问题。听起来您对在调试输出中获取行/函数名称更感兴趣。您可以使用 qInstallMessageHandler 轻松完成此操作。

首先定义您的消息处理函数。 Qt 提供了一个上下文对象,其中包含您想要的所有行/函数信息。

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    const char *file = context.file ? context.file : "";
    const char *function = context.function ? context.function : "";
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    }
}

然后告诉 Qt 使用该函数来处理您的消息,如下所示:

int main(int argc, char **argv)
{
    qInstallMessageHandler(myMessageOutput);
    QGuiApplication app(argc, argv);
    ...
    return app.exec();
}

现在,当您使用 qDebug() 或 console.log() 时,它应该调用您的输出函数,并且您应该看到行号和函数名称。

There is no way to directly call your macro from QML. That is just not possible. But it sounds like that's not real your question. It sounds like you're more interested in just getting the line/function names in your debug output. You can do that easily with qInstallMessageHandler.

Start by defining your message handling function. Qt provides a context object that has all the line/function info you want.

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    const char *file = context.file ? context.file : "";
    const char *function = context.function ? context.function : "";
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    }
}

Then tell Qt to use that function to handle your messages, like this:

int main(int argc, char **argv)
{
    qInstallMessageHandler(myMessageOutput);
    QGuiApplication app(argc, argv);
    ...
    return app.exec();
}

Now when you use qDebug() or console.log(), it should call your output function and you should see the line numbers and function names.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文