首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候必须调用qRegisterMetaType()?

什么时候必须调用qRegisterMetaType()?
EN

Stack Overflow用户
提问于 2019-06-30 20:17:49
回答 1查看 545关注 0票数 3

我研究过qRegisterMetaType()的qt文档,其中说明必须先调用此函数,然后才能在信号/槽机制中使用相应的类型。但是,我找不到任何必须手动完成此操作的代码示例。

This页面指出,如果moc可以确定该类型可以被注册为元类型,则该注册由moc自动完成。看起来这是对的,因为我只使用Q_DECLARE_METATYPE(类型)测试了QSignalSpy、QObject::connect() (直接和队列连接)和QVariant,它们都不需要显式调用qRegisterMetaType才能工作。

所以我的问题是:什么时候我必须调用qRegisterMetaType(),因为否则代码将无法工作?

EN

回答 1

Stack Overflow用户

发布于 2019-07-01 14:01:47

Qt文档说,如果有一个连接是队列连接,则Q_DECLARE_METATYPE是必要的。

添加一个Q_DECLARE_METATYPE()使该类型为所有基于模板的函数所知,包括QVariant。请注意,如果您打算在排队的信号和插槽连接中或在QObject的属性系统中使用该类型,则还必须调用qRegisterMetaType(),因为这些名称是在运行时解析的。

为此,我构建了一个小的测试应用程序,它举例说明了这种行为。

只需尝试删除Q_DECLARE_METATYPE(Message),并观察警告和输出的变化。在正常连接的情况下,宏似乎是不必要的。

main.cpp

代码语言:javascript
复制
#include <QApplication>
#include <QThread>
#include "MyHeaderView.h"

Q_DECLARE_METATYPE(Message);

int main(int argc, char **args)
{
    QApplication app(argc, args);
    {
        TestObject sender;
        TestObject receiver;
        QObject::connect(&sender, &TestObject::sendMessage, &receiver, &TestObject::onMessage);
        sender.emitMessage(1, 2);
    }


    // This requires Q_DECLARE_METATYPE(Message);
    QThread workerThread;
    TestObject sender2;
    TestObject receiver2;
    receiver2.moveToThread(&workerThread);
    workerThread.start();
    QObject::connect(&sender2, &TestObject::sendMessage, &receiver2, &TestObject::onMessage, Qt::ConnectionType::QueuedConnection);
    sender2.emitMessage(3, 4);

    app.exec();
}

测试对象.h

代码语言:javascript
复制
#pragma once

#include <QObject>
#include <QDebug>

struct Message
{
    int x;
    int y;
};

class TestObject : public QObject
{
    Q_OBJECT
public:
    void emitMessage(int x, int y) { emit sendMessage(Message{ x,y }); }
    signals:
        void sendMessage(const Message&);

public slots:
    void onMessage(const Message& m) { qDebug() << m.x << m.y; }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56824783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档