首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMetaType是否与模板类型一起工作

QMetaType是否与模板类型一起工作
EN

Stack Overflow用户
提问于 2012-07-30 16:35:05
回答 2查看 1.5K关注 0票数 1

我的班上有typedef ProxyTray<QImage, ImageCaptureService> TrayType; (这是QObject,但ProxyTray不是QObject)。我在信号中使用这种类型,插槽作为参数类型。

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

EN

回答 2

Stack Overflow用户

发布于 2016-05-14 21:45:12

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

代码语言:javascript
复制
Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)

例如:

代码语言:javascript
复制
template<class T>
class Foo { 

};
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo)

允许通过Foo<int>Foo<QString>等.信号和插槽。

代码语言:javascript
复制
template<class T, class U>
class Foo { 

};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)

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

然而,有两个注意事项:

  • 这不是官方Qt的一部分,可能会在某个时候消失。
  • 模板类型必须使用Q_DECLARE_METATYPE自己注册:Foo<Bar>也需要将Bar注册为元类型(从QT5.6开始)
票数 3
EN

Stack Overflow用户

发布于 2012-08-17 17:47:08

是的,模板类型可以在Qt信号/插槽中使用。由于您已经为您的类型提供了一个typedef,所以可以使用Q_DECLARE_METATYPE,如下例所示:

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11725730

复制
相关文章

相似问题

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