【发布时间】:2017-03-23 13:25:06
【问题描述】:
考虑以下类定义:
// exported.hpp
#include <QObject>
class Exported: public QObject {
Q_OBJECT
public:
using QObject::QObject;
enum class FOO { BAR };
Q_ENUM(FOO)
};
还有以下main文件:
// main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include "exported.hpp"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<Exported>("Package", 1, 0, "Exported");
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
通过这样做,我可以轻松地在 QML 中访问我的枚举的命名常量。
举个例子:
// main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import Package 1.0
ApplicationWindow {
Rectangle {
Component.onCompleted: {
console.log(Exported.BAR)
}
}
}
只要枚举的声明包含在类中,这就会起作用。
例如,如果我按如下所示更改类定义,它就不再起作用了:
// exported.hpp
#include <QObject>
enum class FOO { BAR };
class Exported: public QObject {
Q_OBJECT
public:
using QObject::QObject;
using FOO = ::FOO;
Q_ENUM(FOO)
};
现在,QML 文件中的Exported.BAR 是undefined。
最基本的问题是:为什么它不适用于 using 声明?
请注意,它适用于转发声明,例如:
// exported.hpp
#include <QObject>
enum class FOO { BAR };
class Exported: public QObject {
Q_OBJECT
public:
using QObject::QObject;
enum class FOO;
Q_ENUM(FOO)
enum class FOO { BAR };
};
Q_ENUM 的 documentation 实际上是这样(强调我的):
这个宏向元对象系统注册一个枚举类型。 它必须放在具有 Q_OBJECT 或 Q_GADGET 宏的类中的枚举声明之后。
在整个部分中没有提及定义。
另一方面,我们从标准中得到了这个:
using-declaration 将一组声明引入到 using-declaration 出现的声明区域中。
所以,我期待它也能正常工作。无论如何,这对我来说可能是一个错误的期望。
也就是说,有什么建议可以解决这样的不便吗?
如果 enum 是在类之外定义的,我可以看到解决它的唯一方法是在类中定义另一个 enum 并具有一对一它们之间的映射。
它远非可维护而且确实有点乏味。
【问题讨论】:
标签: c++ qt c++11 qt5 using-declaration