我想将枚举的元素用作QComboBox中的项目。如果枚举是在同一类中定义的,那么我可以这样做,但是我想使用在头文件中定义的枚举。我的目标是直接从头文件使用枚举,而不更改头文件。此外,我希望我的代码在元素名称和元素数量上都适应不断变化的枚举。
我发现this answer和this 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与在头文件中定义的枚举一起使用? 我该怎么做?
答案 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()打印为字符串。