QT-通过引用捕获Lambda-qmlRegisterSingletonType



main.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表示,变量"member"不能在未指定捕获默认值的lambda中隐式捕获。

我如何使用";成员";通过引用我的lambda表达式?

最小可复制示例:myclass.h:

#ifndef MYCLASS_H
#define MYCLASS_H
#include "myclassmember.h"
class MyClass
{
public:
MyClass();
MyClassMember *member;
};
#endif // MYCLASS_H

myclass.cpp:

#include "myclass.h"
MyClass::MyClass()
{
member = new MyClassMember();
}

myclassmember.h:

#ifndef MYCLASSMEMBER_H
#define MYCLASSMEMBER_H
#include <QList>

class MyClassMember
{
public:
MyClassMember();
QList<int> mylist;
void addNumber(int _num);
};
#endif // MYCLASSMEMBER_H

myclassmember.cpp:

#include "myclassmember.h"
MyClassMember::MyClassMember()
{
}
void MyClassMember::addNumber(int _num)
{
mylist.append(_num);
}

main.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();
}

它有两个错误:

  • 您必须在捕获部分传递成员。

    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可以是singleton。

    class MyClassMember: public QObject
    {
    // ...
    };
    

除了eyllanesc的答案。。Qt 5.12不会编译qmlRegisterSingletonType中带有闭包的lambda,而Qt 5.15会编译。

最新更新