Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 头文件中带有枚举的Q_枚举_Qt_Enums - Fatal编程技术网

Qt 头文件中带有枚举的Q_枚举

Qt 头文件中带有枚举的Q_枚举,qt,enums,Qt,Enums,我想将枚举的元素用作QComboBox中的项。如果枚举是在同一个类中定义的,我可以这样做,但我希望使用头文件中定义的枚举。我的目标是直接从头文件使用enum,而不改变头文件。此外,我希望我的代码能够适应不断变化的枚举,包括元素的名称和数量 我已经找到并帮助我理解了如何用枚举填充QComboBox。答案中的解决方案对我有效,但前提是类中定义了枚举 我想实现的基本代码如下所示: 定义.h #ifndef _DEFINITIONS_H_ #define _DEFINITIONS_H_ typedef

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

我已经找到并帮助我理解了如何用枚举填充QComboBox。答案中的解决方案对我有效,但前提是类中定义了枚举

我想实现的基本代码如下所示:

定义.h

#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);