QMetaType是否与模板化类型一起使用

时间:2012-07-30 16:35:05

标签: c++ qt

我的班级typedef ProxyTray<QImage, ImageCaptureService> TrayType; QObject,但ProxyTray QObject)。我在Signal,Slots中使用该类型作为参数类型。

qRegisterMetaType是否接受此类型?我如何为参数化类型建模字符串类型名称?

2 个答案:

答案 0 :(得分:2)

您可以使用:

声明模板化元类型
Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)

e.g。

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也要注册为元类型(如 Qt 5.6)

答案 1 :(得分:1)

是的,模板化类型可用于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();
}