Q_ENUMS头文件中带有枚举

时间:2019-05-02 10:54:16

标签: qt enums

我想将枚举的元素用作QComboBox中的项目。如果枚举是在同一类中定义的,那么我可以这样做,但是我想使用在头文件中定义的枚举。我的目标是直接从头文件使用枚举,而不更改头文件。此外,我希望我的代码在元素名称和元素数量上都适应不断变化的枚举。

我发现this answerthis link有助于我理解如何用枚举填充QComboBox。答案中的解决方案对我有用,但前提是该类中定义了枚举。

我要实现的基本代码如下:

definitions.h

#ifndef _DEFINITIONS_H_
#define _DEFINITIONS_H_

typedef enum
{
     FIRST = 0,
     SECOND,
     THIRD
} elements;

#endif

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "definitions.h"

 class MainWindow : public QMainWindow
 {
   Q_OBJECT
   Q_ENUMS(elements);

 public:
   explicit MainWindow(QWidget *parent = 0);
   QComboBox *comboBox;

 };

 #endif 

mainwindow.cc

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
 QMainWindow(parent),
{
  int index = metaObject()->indexOfEnumerator("elements");
  QMetaEnum metaEnum = metaObject()->enumerator(index);

  for (int i = 0; i < metaEnum.keyCount(); i++)
      comboBox->addItem(metaEnum.valueToKey(i));
 }

此代码在运行时编译时不会遇到任何问题,但完全无效。在MainWindow类中定义枚举就像一种魅力。

它看起来不像是可见性问题,因为我可以在代码中使用枚举的元素,并且没有遇到任何编译问题。

我尝试使用typedef在mainwindow.h中重新定义我的枚举,但没有成功:

typedef elements new_elements

我还尝试按照以下答案建议将Q_ENUMS替换为Q_ENUM,但结果是相同的。

是否可以将Q_ENUMS / Q_ENUM与在头文件中定义的枚举一起使用? 我该怎么做?

2 个答案:

答案 0 :(得分:1)

您不能那样做。 Q_ENUMS需要一个QObject类或Q_GADGET宏提供的元对象,这就是为什么在从QObject派生的类中声明枚举时它可以工作的原因。 / p>

从Qt 5.8开始,引入了一个新的宏Q_ENUM_NS,这使得这成为可能:

  

此宏在元对象系统中注册一个枚举类型。必须将其放在具有Q_NAMESPACE宏的命名空间中的枚举声明之后。与Q_ENUM相同,但位于名称空间中。

您可以执行以下操作:

namespace MyNamespace {

    Q_NAMESPACE

    enum elements {
     FIRST = 0,
     SECOND,
     THIRD
    };

    Q_ENUM_NS(elements)
}

有关更多信息,请参见此post

更新

关于最后一条注释,您可以创建一个新的枚举并将每个元素与新元素的值相关联。

 class MainWindow : public QMainWindow {
   Q_OBJECT
 public:   
     enum elements {
         FIRST = ::elements::FIRST,
         SECOND = ::elements::SECOND,
         THIRD = ::elements::THIRD,
     };
     Q_ENUM(elements);
}

然后,使用以下功能:

void use_enum(elements e);

// Call it with the original one
use_enum(elements::FIRST);
// Call it with the new one, you just created
use_enum(MainWindow::elements::FIRST);

答案 1 :(得分:0)

检查自动注册为元类型的Q_ENUM,如文档What's New in Qt 5.5中所述:

  

添加了Q_ENUM来替换Q_ENUMS,这允许在编译时使用QMetaEnum :: fromType获得QMetaEnum。这样的枚举现在可以自动注册为元类型,并且可以在QVariant中转换为字符串,或者通过qDebug()打印为字符串。