私はtypedef ProxyTray<QImage, ImageCaptureService> TrayType;
自分のクラスにいます(これはQObjectですが、QObjectでProxyTray
はありません)。私はそのタイプを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>
...
ただし、次の 2 つの注意事項があります。
Q_DECLARE_METATYPE
:メタタイプとしても登録する必要があります (Qt 5.6 以降)。Foo<Bar>
Bar
はい、テンプレート化されたタイプは 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();
}