QMetaType与模板化类型一起工作吗

Does QMetaType work with templated Type

本文关键字:一起 工作 类型 QMetaType      更新时间:2023-10-16

我的类中有typedef ProxyTray<QImage, ImageCaptureService> TrayType;(哪个QObject,但ProxyTray不是QObject)。我在Signal中使用该类型,Slots作为参数类型。

qRegisterMetaType接受这样的类型吗?如何为参数化类型的字符串类型名称建模?

您可以使用以下命令声明模板化的元类型:

Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)

例如

template<class T>
class Foo { 
};
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo)

允许将Foo<int>Foo<QString>等传递到信号和时隙。

template<class T, class U>
class Foo { 
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)

允许通过Foo<int, double>Foo<bool, bool>等…

然而,有两个注意事项:

  • 这不是官方Qt API的一部分,可能会在某个时候消失
  • 模板类型本身必须使用Q_DECLARE_METATYPE进行注册:Foo<Bar>也要求Bar注册为元类型(如第5.6季度)

是的,模板化类型可以在Qt信号/插槽中使用。由于您的类型已经有了typedef,您可以简单地使用Q_DECLARE_METATYPE,如下例所示:

#include <QtCore>
template <typename T>
struct Proxy
{
    T data;
};
typedef Proxy<QImage> TrayType;
Q_DECLARE_METATYPE(TrayType)
class Donor : public QObject
{
    Q_OBJECT
public:
    Donor()
    {
        m_proxy.data = QImage(10, 20, QImage::Format_Mono);
    }
    void test()
    {
        emit produce(m_proxy);
    }
signals:
    void produce(const TrayType& proxy);
private:
    TrayType m_proxy;
};
class Acceptor : public QObject
{
    Q_OBJECT
public slots:
    void consume(const TrayType& proxy)
    {
        qDebug() << "The mage size is" << proxy.data.size();
    }
};
int main(int argc, char* argv[])
{
    QCoreApplication app(argc, argv);
    QScopedPointer<Donor> donor(new Donor);
    QScopedPointer<Acceptor> acceptor(new Acceptor);
    QObject::connect(donor.data(), SIGNAL(produce(TrayType)),
                     acceptor.data(), SLOT(consume(TrayType)));
    // Test the signal-slot connection.
    donor->test();
    return app.exec();
}