Есть ли способ эффективно обновить данные CAN в QML? - PullRequest
1 голос
/ 15 октября 2019

В настоящее время я получаю данные CAN в режиме реального времени, используя API-интерфейс socketcan в файле main.cpp.

Я постоянно обновляю фрейм данных CAN в одну переменную в main.cpp.

Я хочу выразить датчик в режиме реального времени, передав переменную, содержащую кадр данных CAN в main.cpp, в индикатор анимации QML.

Мне нужно обнаружить изменение переменной, содержащей данные CAN в QML, в реальном времени. время. Интересно, есть ли эффективный способ?

Я пытался поделиться данными с QML, используя emit. Однако функция, написанная emit внутри device-> connect (device, & QCanBusDevice :: framesReceived, [device] () {...}, не работает.

При ее использовании я получаю сообщение об ошибке

'this' не может быть неявно зафиксировано вэтот контекст.

Я посмотрел на ошибку, но не нашел ответа.

if (QCanBus::instance()->plugins().contains(QStringLiteral("socketcan"))) {
            qWarning() << "plugin available";
        }

        QString errorString;
        QCanBusDevice *device = QCanBus::instance()->createDevice(
            QStringLiteral("socketcan"), QStringLiteral("vcan0"), &errorString);
        if (!device) {
            qWarning() << errorString;
        } else {
            device->connectDevice();
            std::cout << "connected vcan0" << std::endl;

            device->connect(device, &QCanBusDevice::framesReceived, [device]() {

            QCanBusFrame frame = device->readFrame();
            QString testV = frame.toString();

            QString qvSpeed = frame.payload();

            std::string text = testV.toUtf8().constData();
            std::string vSpeed = qvSpeed.toUtf8().constData();

            //At that point the vVal values ​​are being updated in real time.
            //I want to pass the updated vVal to qml gui in real time.
            int vVal = static_cast<int>(frame.payload()[0]);
            //emit sendMessage(vVal); // 'this' cannot be implicitly captured in this context error.

            std::cout << text << std::endl;
            });
        }

На данный момент main.cpp не может отправить данные, а QML можетне исправить ошибку.

Внутри device-> connect, emit sendMessage (vVal); приведет к ошибке "this" не может быть неявно захвачен в этом контексте "ошибка.

Мне интересно, если естьхороший способ реализовать анимацию, отображая данные QML GUI в реальном времени.

1 Ответ

1 голос
/ 23 октября 2019

Ваша фраза захвата захватывает только device. Вам также необходимо явно захватить this:

device->connect(device, &QCanBusDevice::framesReceived, [this,device]{ /*...*/ });

Кстати, обратите внимание, что нет необходимости указывать () для лямбда-выражения без аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...