gpt4 book ai didi

c++ - 无法从另一个类中定义的枚举声明 Q_ENUM

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:29 25 4
gpt4 key购买 nike

This documentation

If you want to register an enum that is declared in another class, the enum must be fully qualified with the name of the class defining it. In addition, the class defining the enum has to inherit QObject as well as declare the enum using Q_ENUMS().

但是在下面的例子中我无法做到这一点。

A 类:

#ifndef CLASSA_H
#define CLASSA_H

#include <classb.h>

class ClassA : public QObject
{
Q_OBJECT
Q_ENUMS(ClassB::TestEnum)

public:
explicit ClassA(QObject *parent = 0) : QObject(parent)
{
const QMetaObject *metaObj = this->metaObject();
qDebug() << metaObj->enumeratorCount();
}
};

#endif // CLASSA_H

B 类:

#ifndef CLASSB_H
#define CLASSB_H

#include <QDebug>
#include <QMetaEnum>
#include <QObject>

class ClassB : public QObject
{
Q_OBJECT
Q_ENUMS(TestEnum)

public:
enum TestEnum { A, B, C };

explicit ClassB(QObject *parent = 0) : QObject(parent)
{
const QMetaObject *metaObj = this->metaObject();
qDebug() << metaObj->enumeratorCount();
}
};

#endif // CLASSB_H

主要内容:

#include <classa.h>
#include <classb.h>

int main()
{
ClassA objectA;
ClassB objectB;
}

预期输出:

1

1

实际输出:

0

1

最佳答案

这里是一些小研究的总结:

  • 文档中关于注册在另一个类中声明的枚举的信息看起来已经过时了。

  • Q_ENUMS(Class::EnumName 不会创建新的枚举器,而且没有用。

  • 当您在 ClassA 中声明新的 Q_PROPERTY 时,您应该使用枚举 ClassB::EnumName 的完整形式。

  • 一旦 EnumName 在 ClassB 中注册,就不需要再注册了。

  • 使用另一个类的枚举器创建的属性可以正常工作。

    class ClassA : public QObject
    {
    public:
    Q_OBJECT
    Q_PROPERTY(ClassB::TestEnum test READ test)

    public:
    explicit ClassA(QObject *parent = 0)
    {
    const QMetaObject *metaObj = this->metaObject();
    qDebug() << metaObj->enumeratorCount();

    QMetaProperty property = metaObj->property(metaObj->indexOfProperty("test"));
    if (property.isEnumType())
    {
    const QMetaEnum& enumerator = property.enumerator();

    qDebug() << enumerator.name();

    for (int i = 0 ; i < enumerator.keyCount(); i++)
    {
    qDebug() << QLatin1String(enumerator.key(i)) << enumerator.value(i);
    }
    }
    }
    ClassB::TestEnum test() const
    {
    return ClassB::A;
    }
    };

输出:

0 
TestEnum
"A" 0
"B" 1
"C" 2

关于c++ - 无法从另一个类中定义的枚举声明 Q_ENUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25795238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com