c++ - 在基类中定义枚举时,qml 中的 Q_ENUM 未定义值
问题描述
Q_ENUM
在继承的枚举上使用时,不能按 (I) 预期工作。
例如,有一个基本结构A
(遗留类),B
它继承自 A 和QObject
. A
有一个枚举并且B
有Q_ENUM
这个枚举。
bh
#pragma once
#include <QObject>
#include <QDebug>
struct A
{
A() = default;
virtual ~A() = default;
enum E_FOO{
FOO = 1000,
FOOO,
FOOOO
};
};
class B
: public QObject
, public A
{
Q_OBJECT
Q_ENUMS(E_FOO) // OPTION 1 doesn't work
public:
B() {
qDebug() << "enums from A" << B::FOO << B::FOOO<<B::FOOOO;
qDebug() << "enums from B" << B::BAR << B::BARR << B::BARRR;
}
// Q_ENUM(E_FOO) // OPTION 2 doesn't work
// using E_FOO_FORWARDED = A::E_FOO; // OPTION 3 doesn't work
// Q_ENUM(E_FOO_FORWARDED)
// additional enum (for testing a "normal" case)
enum E_BAR {
BAR = 1111,
BARR,
BARRR
};
Q_ENUM(E_BAR)
};
这是一些要加载的 qml 文件,它只在创建时打印枚举值。
主窗口.qml
import QtQuick 2.7
import QtQuick.Layouts 1.0
import QtQuick.Controls 2.3
import mmm 1.0
ApplicationWindow {
Component.onCompleted:{
console.log("checking if values are correct:")
console.log("B.FOO should be = 1000", B.FOO)
console.log("B.BAR should be = 1111", B.BAR)
}
}
这是一个运行它的主文件:
主文件
#include <QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
#include <QtQuick/QQuickWindow>
#include <QObject>
#include <QDebug>
#include "b.h"
int main(int argc, char *argv[])
{
qmlRegisterUncreatableType<B>("mmm",1, 0, "B", "err");
// (check qDebug capabilities that are coded inside the
B b; consturctor)
// checking enum inside qml
QGuiApplication a(argc, argv);
QQmlApplicationEngine eng(QUrl("qrc:/qml/MainWindow.qml"));
QQuickWindow* window = qobject_cast<QQuickWindow*>(eng.rootObjects().first());
window->show();
return a.exec();
}
结果是
enums from A 1000 1001 1002
enums from B B::E_BAR(BAR) B::E_BAR(BARR) B::E_BAR(BARRR)
qml: checking if values are correct:
qml: B.FOO should be = 1000 undefined
qml: B.BAR should be = 1111 1111
所以:
- (qDebug 中的名称打印)的新功能
Q_ENUM
不起作用 - 老
Q_ENUMS
也行不通 - qml 中的值未定义
- 正常枚举(不是来自基类)按预期工作
我尝试制作using E_FOO_FORWARDED = A::E_FOO
具有相同结果的别名类型 ( )。这个问题有解决方案吗?
项目的附加文件
继承枚举.pro
QT += gui core qml quick
TEMPLATE = app
CONFIG += c++14 console qml
SOURCES += main.cpp
RESOURCES += qml.qrc
qml.qrc
<RCC>
<qresource prefix="/qml">
<file>MainWindow.qml</file>
</qresource>
</RCC>
解决方案
Qt 扩展之类Q_ENUM
的由宏和 moc 处理,它们仅处理所需的 C++ 子集。它并不真正处理继承,只适用于当前的类定义。
因此,您必须将您Q_ENUMS
的放在底层的定义类中enum
。
推荐阅读
- go - 返回具有测试期望的结构图 Go
- python-3.x - 我如何在 python selenium 中输入我的登录信息
- java - spring boot 关系删除一些项
- docker - Docker:挂载的目录没有文件
- javascript - CodeWars Take a Minute Walk Kata - 我的代码有什么问题?
- python - 如何使用xlwings Python同时打开3个excel文件?
- json - 为什么我会收到 Json Malformed Exception?
- html - 使任意表列宽等于可用空间
- reactjs - React 生命周期和 Intersection 观察者
- azure-sql-database - 插入时为 RLS 过滤用户引发 DbUpdateConcurrency 异常