【发布时间】:2016-05-24 13:45:35
【问题描述】:
我正在使用 Qt 学习 QML,但在将 enum class 传递给 qml 时遇到了一些麻烦。
当我使用带有int 参数的信号时 - 没关系,代码可以完美运行。
但是,这里有麻烦,如果我使用带有一些 enum class 参数的信号,我在 qml 信号处理程序中有 undefined 值。我试图通过qmlRegisterType 注册enum class,但它不起作用。我将不胜感激。
代码如下:
一些 Helper 类
class Helper : public QObject
{
Q_OBJECT
Q_ENUMS(Requester)
Q_ENUMS(JANSWER)
public:
enum class Requester {
ReqLogin,
ReqNull,
ReqSave,
ReqError,
ReqUnknown
};
enum class JANSWER {
OK,
Complete,
Error,
Unknown
};
};
main.cpp
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<JsonPackWorker>("com.jsonpackworker", 1, 0, "JsonPackWorker");
qmlRegisterType<Helper>("com.Helper", 1, 0, "Helper");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
JsonPackWorker.h
class JsonPackWorker : public QObject
{
Q_OBJECT
public:
<...>
signals:
<...>
void sendAnswer(Helper::Requester req, Helper::JANSWER answer);
public slots:
<...>
};
JsonPackWorker.cpp 中的某处
emit sendAnswer(Helper::Requester::ReqNull, Helper::JANSWER::OK);
main.qml
<...>
import com.jsonpackworker 1.0
import com.Helper 1.0
ApplicationWindow {
id: mainWindow
// Requests in answers
property int reqLogin: Helper.ReqLogin
<...>
JsonPackWorker {
id: packWorker
<...>
onSendAnswer: {
// Here I've got undefined undefined if there enum class parameters
console.log(req + " " + answer)
switch(req) {
case reqLogin: loginDial.checkLogin(answer)
break;
default:
}
}
}
}
【问题讨论】:
-
如何它不起作用?你有构建错误吗?运行时崩溃?出乎意料的结果?还有什么?请详细说明。如果您还没有这样做,请read about how to ask good questions。
-
把
enum class改成enum能用吗? -
@Joachim Pileborg,我写道,我在处理程序中有一个未定义的值。代码显示
console.log()我用描述评论了该部分。 -
@coyotte508,如果我将
enum class更改为enum,我应该将我的信号更改为void sendAnswer(int req, int answer);,它会完美运行。但这不是有趣的方式。 -
对于它的价值,它在枚举属于
JsonPackWorker类本身时起作用。至于为什么在使用另一个注册类的枚举时不起作用,我只能假设它是一个错误。