Я хочу использовать элементы перечисления в качестве элементов в QComboBox. Я могу сделать это, если enum определен в том же классе, но я бы хотел использовать enum, определенный в заголовочном файле. Моя цель - использовать перечисление непосредственно из файла заголовка, не изменяя файл заголовка. Более того, я хотел бы, чтобы мой код адаптировался к изменяющемуся перечислению, как по названию элементов, так и по их количеству.
Я нашел этот ответ и эту ссылку , которые помогли мне понять, как заполнить 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 работает как шарм.
Это не похоже на проблему видимости, потому что я могу использовать элементы enum в своем коде, и я не столкнулся с какой-либо проблемой компиляции.
Я попытался переопределить мой enum в mainwindow.h с помощью typedef, но безуспешно:
typedef elements new_elements
Я также пытался заменить Q_ENUMS
на Q_ENUM
, как предлагается в ответе ниже, но результат тот же.
Можно ли использовать Q_ENUMS / Q_ENUM с перечислением, определенным в заголовочном файле?
Что я должен делать по-другому?