c++ - QT - Lambda-Capture by reference - qmlRegisterSingletonType
问题描述
主.cpp:
MyClass *myclass = new MyClass();
MyClassMember *member = myclass->member;
int myclassmember_id= qmlRegisterSingletonType<MyClassMember>("medica.singleton", 1, 0, "MyClassMember", [&member](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
...
}
Qt 不允许我通过引用捕获并将“[&member]”部分标记为错误,说:“没有匹配函数调用 'qmlRegisterSingletonType'”。
我也尝试在我的 main.cpp 中这样做:
MyClass *myclass = new MyClass();
int myclassmember_id= qmlRegisterSingletonType<MyClassMember>("medica.singleton", 1, 0, "MyClassMember", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
MyClassMember *member = myclass->member;
...
}
但是 Qt 说变量“成员”不能在没有指定捕获默认值的 lambda 中隐式捕获。
如何在我的 lambda 表达式中通过引用使用“成员”?
最小可重现示例:myclass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
#include "myclassmember.h"
class MyClass
{
public:
MyClass();
MyClassMember *member;
};
#endif // MYCLASS_H
我的类.cpp:
#include "myclass.h"
MyClass::MyClass()
{
member = new MyClassMember();
}
我的班级成员.h:
#ifndef MYCLASSMEMBER_H
#define MYCLASSMEMBER_H
#include <QList>
class MyClassMember
{
public:
MyClassMember();
QList<int> mylist;
void addNumber(int _num);
};
#endif // MYCLASSMEMBER_H
我的班级成员.cpp:
#include "myclassmember.h"
MyClassMember::MyClassMember()
{
}
void MyClassMember::addNumber(int _num)
{
mylist.append(_num);
}
主.cpp:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "myclass.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
MyClass *myclass = new MyClass();
MyClassMember *member = myclass->member;
int uibackend_id = qmlRegisterSingletonType<MyClassMember>("medica.singleton", 1, 0, "MyClassMember", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
member->addNumber(1); //ERROR: variable 'member' cannot be implicitly captured in a lambda with no capture-default specified
});
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
解决方案
它有2个错误:
您必须在捕获部分传递成员。
int uibackend_id = qmlRegisterSingletonType<MyClassMember>("medica.singleton", 1, 0, "MyClassMember", [member](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * { Q_UNUSED(engine) Q_UNUSED(scriptEngine) member->addNumber(1); return member; });
只有 QObjects 可以是单例的。
class MyClassMember: public QObject { // ... };
推荐阅读
- javascript - 在没有 jQuery 的情况下将背景图像更改为数据 URI
- javascript - TestCafe:如何让我的并发测试运行程序保持打开状态?
- flutter - 如何在颤振地图上获得标记纬度和经度?
- python - 尝试在很长的列表中查找重复项时 Python 崩溃
- robotframework - 单击复选框时,返回错误说另一个元素将收到点击
- python-3.x - 如何将芹菜任务添加到队列顶部?
- python - 传递给模板引擎的 Python/Django 通用方法
- python - 如何创建一个简单的机器人来自动响应包含某个触发语句的消息?
- database - PostgresSQL函数:选择查询中in子句的函数参数类型?
- c# - 这个编译时错误是什么意思?“访问非静态成员需要对象引用。”