Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMetaType与模板化类型一起工作吗_C++_Qt - Fatal编程技术网

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

C++ QMetaType与模板化类型一起工作吗,c++,qt,C++,Qt,我有typedef ProxyTray TrayType在我的类中(它是QObject,但ProxyTray不是QObject)。我在信号中使用这种类型,插槽作为参数类型 qRegisterMetaType是否接受这种类型?如何为参数化类型建模字符串类型名称?是的,可以在Qt信号/插槽中使用模板化类型。由于您的类型已经有了typedef,您只需使用Q\u DECLARE\u元类型即可,如下例所示: #include <QtCore> template <typename T&

我有
typedef ProxyTray TrayType在我的类中(它是QObject,但
ProxyTray
不是QObject)。我在信号中使用这种类型,插槽作为参数类型


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

是的,可以在Qt信号/插槽中使用模板化类型。由于您的类型已经有了
typedef
,您只需使用
Q\u DECLARE\u元类型即可,如下例所示:

#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();
}
#包括
样板
结构代理
{
T数据;
};
typedef代理TrayType;
Q_DECLARE_元类型(TrayType)
类捐赠者:公共QObject
{
Q_对象
公众:
捐赠者()
{
m_proxy.data=QImage(10,20,QImage::Format_Mono);
}
无效测试()
{
发出产品(m_代理);
}
信号:
无效生成(const TrayType&proxy);
私人:
TrayType m_代理;
};
类接受者:公共QObject
{
Q_对象
公众时段:
无效消耗(常量传输类型和代理)
{

qDebug()是的,可以在Qt信号/插槽中使用模板类型。由于您的类型已经有了
typedef
,您只需使用
Q_DECLARE\u元类型即可,如下例所示:

#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();
}
#包括
样板
结构代理
{
T数据;
};
typedef代理TrayType;
Q_DECLARE_元类型(TrayType)
类捐赠者:公共QObject
{
Q_对象
公众:
捐赠者()
{
m_proxy.data=QImage(10,20,QImage::Format_Mono);
}
无效测试()
{
发出产品(m_代理);
}
信号:
无效生成(const TrayType&proxy);
私人:
TrayType m_代理;
};
类接受者:公共QObject
{
Q_对象
公众时段:
无效消耗(常量传输类型和代理)
{

qDebug()您可以通过以下方式声明模板化的元类型:

Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)
e、 g

模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo)
允许将
Foo
Foo
等传递到信号和插槽

template<class T, class U>
class Foo { 

};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
允许传递
Foo
Foo

但是,有两个注意事项:

  • 这不是官方qtapi的一部分,可能会在某个时候消失
  • 模板类型本身必须使用
    Q\u DECLARE\u元类型注册
    Foo
    要求
    Bar
    也注册为元类型(如下所示 第5.6节)

您可以通过以下方式声明模板化的元类型:

Q_DECLARE_METATYPE_TEMPLATE_1ARG(TemplatedClass)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(TemplatedClass)
e、 g

模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_1ARG(Foo)
允许将
Foo
Foo
等传递到信号和插槽

template<class T, class U>
class Foo { 

};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
模板
类Foo{
};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)
允许传递
Foo
Foo

但是,有两个注意事项:

  • 这不是官方qtapi的一部分,可能会在某个时候消失
  • 模板类型本身必须使用
    Q\u DECLARE\u元类型注册
    Foo
    要求
    Bar
    也注册为元类型(如下所示 第5.6节)

在连接信号插槽之前在ctor中执行了
qRegisterMetaType(“TrayType”);
获取
QObject::connect:无法对类型为“TrayType&”的参数进行排队(请确保使用qRegisterMetaType()注册了“TrayType&”)
您是否在连接信号插槽之前在ctor中传递
非常量引用
did
qRegisterMetaType(“TrayType”)
?可能会有帮助我如何在模板类型上执行
Q\u DECLARE\u METATYPE
操作?看起来我无法在连接信号插槽之前在ctor中传递
非常量引用
did
qRegisterMetaType(“TrayType”)
。获取
QObject::connect:无法对'TrayType&'(请确保使用qRegisterMetaType()注册了“TrayType&”)
您是否
Q\u DECLARE\u METATYPE
?可能会有帮助我如何在模板类型上执行
Q\u DECLARE\u METATYPE
?看起来我无法通过
非常量ref