首页 > 解决方案 > 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();
}

标签: c++qtqml

解决方案


它有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
    {
        // ...
    };
    

推荐阅读