昨天在微信公众号上看到小豆君分享了一个篇文章名为:《Qt中的反射机制之Q_PROPERTY》看完之后自己研究了一下,现在记录一下心得

mystudent.h

Qt元对象学习之Qt中的反射机制之Q_PROPERTY_qt

mystudent.cpp

Qt元对象学习之Qt中的反射机制之Q_PROPERTY_qt_02

main.cpp

Qt元对象学习之Qt中的反射机制之Q_PROPERTY_qt_03

由于该代码在复制粘贴时候出现格式错乱,于是就贴图了,上面是小豆君原版代码,我改过之后的代码会在下面给出链接。

下面是我给setSex(const QString &sex)加了一些我的理解

void MyStudent::setSex(const QString &sex)
{
    //首先获取元对象指针
    static const QMetaObject *meta = metaObject();

    //Returns the number of properties in this class, including the number of properties provided by each base class
    //获取该类所有的属性值
    QStringList properties;
    for(int i = meta->propertyOffset(); i < meta->propertyCount(); ++i)
        properties << QString::fromLatin1(meta->property(i).name());

    qDebug()<<properties;
    //这里输出结果:("id", "name", "sex")


    //根据属性名Sex查找m_sex属性对象QMetaProperty
    //发现属性名并返回其索引;否则返回-1。根据属性名"sex"查找该属性的索引
    static int propindex = meta->indexOfProperty("sex");


    //Returns the meta-data for the property with the given index. If no such property exists, a null QMetaProperty is returned.
    //返回与给定属性的元数据索引。如果没有这样的属性存在,返回一个null QMetaProperty。
    static const QMetaProperty mp = meta->property(propindex);

    //Returns the enumerator if this property's type is an enumerator type; otherwise the returned value is undefined.
    //返回枚举器如果这个属性的类型是一个枚举器类型;否则返回的值是未定义的。
    QMetaEnum menum = mp.enumerator();

    //把传入的sex转换成const char *
    const char *ntyp = sex.toStdString().c_str();

    //Returns the integer value of the given enumeration key, or -1 if key is not defined.
    //返回给定的枚举的整数值键,或-1如果没有定义的关键。
    m_sex = static_cast<Sex>(menum.keyToValue(ntyp));
    qDebug()<<"QMetaEnum"<<m_sex<<menum.name()<<menum.key(m_sex)<<menum.valueToKey(Sex::Man);

}

接下来修改了getSex函数,使其可以返回枚举类型的字符串而不是下标

QString MyStudent::getSexString() const
{
#if 0
    //这种方式只返回m_sex的数字下标
    return property("sex").toString();
#else

    QMetaEnum metaEnum = QMetaEnum::fromType<MyStudent::Sex>();
    QString str = metaEnum.valueToKey(m_sex);
    return str;

#endif
}