qmetatype ::类型从模板类型类型

QMetaType::Type from template type

本文关键字:类型 qmetatype      更新时间:2023-10-16

是否可以确定qmetatype ::键入模板参数的值。

我尝试了:

template <class T>
class MyClass {
public:
    int getType() {
        return QMetaType::type(typeid(T).name());
    }
};

但这总是返回0(qmetatype :: unknowntype),因为QT使用与编译器不同的类型名称。

它应该像以下内容一样工作:

MyClass<int>().getType();     // 2 (QMetaType::Int)
MyClass<QString>().getType(); // 10 (QMetaType::QString)
MyClass<QRect>().getType();   // 19 (QMetaType::QRect)
MyClass<MyType>().getType();  // 1024 (Set by qRegisterMetaType)

我在QT 5.12.4上测试了您的代码,并且似乎可以使用。您也可以q_declare_metatype注册您的自定义类型,然后使用qmetatypeID()获取元型ID。

在这里我的测试代码和示例:

#include <QCoreApplication>
#include <QDebug>
#include <QMetaType>
#include <QRect>
#include <QMetaObject>
class MyType
{
public:
    int _member;
};
// needed for getType2()
Q_DECLARE_METATYPE(MyType);
// needed for getType()
const int id = qRegisterMetaType<MyType>("MyType");
template <class T>
class MyClass {
public:
    int getType() {
        return QMetaType::type(typeid(T).name());
    }
    int getType2() {
        return qMetaTypeId<T>();
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << MyClass<int>().getType();
    qDebug() << MyClass<QString>().getType();
    qDebug() << MyClass<QRect>().getType();
    qDebug() << MyClass<MyType>().getType();
    qDebug() << MyClass<int>().getType2();
    qDebug() << MyClass<QString>().getType2();
    qDebug() << MyClass<QRect>().getType2();
    qDebug() << MyClass<MyType>().getType2();
    return a.exec();
}

此输出:

2
10
19
1024
2
10
19
1024