是否可以确定模板参数的QMetaType::Type值。

我尝试了这个:

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()获取metaType 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

关于c++ - QMetaType::Type来自模板类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46275120/

10-09 06:23