• QMetaEnum获取枚举元信息


    QMetaEnum 类提供了一个枚举的元数据。我们可以使用该类的静态模板函数,fromType<enumerator>来获得关于某个枚举的QMetaEnum对象,然后就可以调用该类的成员函数来获得该枚举的相关信息。该枚举必须使用Q_ENUM宏进行声明。

    我们可以使用name()函数来获得枚举的名字;使用key()函数获得枚举的键,即每个枚举项的名字;使用keyCount()函数得到键的个数。

    isFlag()函数可以用来判断该枚举是否可以作为flag使用,即每一个枚举项是否可以使用OR操作符进行运算。

    keyToValue(),valueToKey(),keysToValue()和valueToKeys()函数,可以用来在枚举项的整数表示和字符串表示之间进行转换。

    scope()函数可以返回该枚举作用域的类名,即给枚举所在的类。

    下面,我们通过一个例子,简单的使用一下该类的每一个成员函数。代码如下:

    我们先声明一个QObject的子类,在该类中定义一个枚举类型:

    #ifndef MYCLASS_H
    #define MYCLASS_H

    #include <QObject>

    class MyClass : public QObject
    {
    Q_OBJECT
    public:
    explicit MyClass(QObject *parent = 0);
    ~MyClass(){}

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)
    };

    #endif // MYCLASS_H


    然后在main函数,使用QMetaEnum打印出该枚举的详细信息:
    #include <QCoreApplication>
    #include <QMetaEnum>
    #include <QDebug>
    #include "myclass.h"

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    QMetaEnum me = QMetaEnum::fromType<MyClass::Priority>();
    qDebug() << me.isFlag();
    qDebug() << me.isValid();
    for(int i = 0; i < me.keyCount(); i++)
    qDebug() << me.key(i);
    qDebug() << me.keyToValue("High");
    qDebug() << me.name();
    qDebug() << me.scope();
    for(int i = 0; i < me.keyCount(); i++)
    qDebug() << me.value(i);
    qDebug() << me.valueToKey(2);

    return a.exec();
    }
    运行结果如下:


    由输出结果可以看到,由于我们没有将枚举声明为flag,所以isFlag()函数返回false。

    如果我们在Q_ENUM(Property)下面添加下面在两句代码:

    Q_DECLARE_FLAGS(Priorities, Priority)
    Q_FLAG(Priorities)


    再讲main函数中fromType()函数的调用修改如下:
    QMetaEnum me = QMetaEnum::fromType<MyClass::Priorities>();


    再运行程序,结果如下:


    可以看到,此时isFlag()函数就返回了true,并且对其他函数的调用并不受影响。这是因为,Q_FLAG宏会向Qt元对象系统注册每一个枚举项。也就是说,使用了Q_FLAG,就不必再使用Q_ENUM宏了。所以,将Q_ENUM(property)注释掉,代码仍可以争取运行,大家可以自行测试即可。
    ---------------------
    作者:求道玉
    来源:CSDN
    原文:https://blog.csdn.net/Amnes1a/article/details/69089469
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    (hdu 7.1.8)Quoit Design(最低点——在n一个点,发现两点之间的最小距离)
    [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]
    《走开》反馈
    二分基础
    日历的问题C语言,C++(boost),python,Javascript,Java和Matlab实现
    Unity3D 游戏开发架构篇 ——性格一流的设计和持久性
    2015第54周四
    2015第54周三
    2015第54周二
    2015第54周一
  • 原文地址:https://www.cnblogs.com/findumars/p/11161025.html
Copyright © 2020-2023  润新知