1

私はtypedef ProxyTray<QImage, ImageCaptureService> TrayType;自分のクラスにいます(これQObjectですが、QObjectでProxyTrayはありません)。私はそのタイプを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>などをシグナルとスロットに渡すことができます。

template<class T, class U>
class Foo { 

};
Q_DECLARE_METATYPE_TEMPLATE_2ARG(Foo)

Foo<int, double>、などを渡すことができますFoo<bool, bool>...

ただし、次の 2 つの注意事項があります。

  • これは公式の Qt API の一部ではなく、ある時点で消える可能性があります。
  • テンプレートタイプは、それ自体を使用して登録する必要がありますQ_DECLARE_METATYPE:メタタイプとしても登録する必要があります (Qt 5.6 以降)。Foo<Bar>Bar
于 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 に答える