1

typedef ProxyTray<QImage, ImageCaptureService> TrayType;在我的课上(这QObjectProxyTray不是QObject)。我在 Signal, Slots 中使用该类型作为参数类型。

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

4

2 回答 2

3

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

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>, etc... 传递给信号和插槽。

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 开始)
于 2016-05-14T21:45:12.290 回答
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();
}
于 2012-08-17T17:47:08.007 回答