Qt 头文件中带有枚举的Q_枚举
我想将枚举的元素用作QComboBox中的项。如果枚举是在同一个类中定义的,我可以这样做,但我希望使用头文件中定义的枚举。我的目标是直接从头文件使用enum,而不改变头文件。此外,我希望我的代码能够适应不断变化的枚举,包括元素的名称和数量 我已经找到并帮助我理解了如何用枚举填充QComboBox。答案中的解决方案对我有效,但前提是类中定义了枚举 我想实现的基本代码如下所示: 定义.hQt 头文件中带有枚举的Q_枚举,qt,enums,Qt,Enums,我想将枚举的元素用作QComboBox中的项。如果枚举是在同一个类中定义的,我可以这样做,但我希望使用头文件中定义的枚举。我的目标是直接从头文件使用enum,而不改变头文件。此外,我希望我的代码能够适应不断变化的枚举,包括元素的名称和数量 我已经找到并帮助我理解了如何用枚举填充QComboBox。答案中的解决方案对我有效,但前提是类中定义了枚举 我想实现的基本代码如下所示: 定义.h #ifndef _DEFINITIONS_H_ #define _DEFINITIONS_H_ typedef
#ifndef _DEFINITIONS_H_
#define _DEFINITIONS_H_
typedef enum
{
FIRST = 0,
SECOND,
THIRD
} elements;
#endif
主窗口
#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
正如下面的答案所建议的,我还尝试用Q_ENUM
替换Q_ENUM
,但结果是一样的
是否可以将Q_ENUM/Q_ENUM与头文件中定义的枚举一起使用?
我应该做些什么不同?检查自动注册为元类型的Q_枚举,如文档中所述: 添加了Q_ENUM以替换Q_ENUM,这允许在编译时使用QMetaEnum::fromType获取QMetaEnum。这样的枚举现在自动注册为元类型,可以在QVariant内转换为字符串,也可以由qDebug()打印为字符串
你不能那样做
Q_enum
需要一个由QObject
类或Q_GADGET
宏提供的元对象,这就是为什么在从QObject
派生的类中声明enum时它会起作用
自Qt 5.8以来,引入了一个新的宏Q_ENUM_NS
,使这成为可能:
此宏向元对象系统注册枚举类型。它必须放在具有Q_namespace宏的命名空间中的枚举声明之后。它与Q_ENUM相同,但在名称空间中
你可以这样做:
namespace MyNamespace {
Q_NAMESPACE
enum elements {
FIRST = 0,
SECOND,
THIRD
};
Q_ENUM_NS(elements)
}
有关更多信息,请参见此
更新
关于最后一条注释,您可以创建一个新的枚举,并将每个元素与新元素的值相关联
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);
用Q_ENUM替换Q_ENUM对我来说仍然不起作用,我将更新我的答案以包括这一点不幸的是,头文件超出了我的控制范围。作为另一个选项,是否可以将头文件中的枚举复制/链接到mainwindow类中定义的其他枚举?为什么不使用枚举的标准语法?只需编写
enum元素{/*…*/}代码>
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);