Top.Mail.Ru
Уведомления
Очистить все

[Решено] Непрерывная передача значения С++ в Qml

TheRoslyak
(@theroslyak)
Active Member

Добрый день.

Работаю с переменными (так называемый HAL слой) в операционной системе реального времени. Все значения общитываюся каждую наносекунду.

И возможно с этим не получается использовать setValue - программа крашиться.

На видео я запускаю стороннюю программу Hal meter - Она работает так как мене надо. У миеня получается изменять переменную если я взаимодействую с интерфейсом.( Нажил на кнопку, Покрутил слайдер и тд)

https://www.youtube.com/watch?v=N_5Y5sHIq98

Дайте пример того как нужно просто неприрывно передать значения переменной с++ в QML. Посути просто линкануть переменную С++ в QML label

 

 

 

Цитата
Topic starter Размещено : 16.05.2022 18:25
Тэги темы
QML
Aveal
(@aveal)
Illustrious Member Admin

Добрый день, набросал пример:

 

Значение изменяется в TestClass, отображается в Text, main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "testclass.h"



int main(int argc, char *argv[])
{
    QCoreApplicationAA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    qmlRegisterType("myCompany.testClass", 1, 0, "TestClass");

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

main.qml:

import QtQuick 2.15
import QtQuick.Window 2.15
import myCompany.testClass 1.0



Window {
    width: 320
    height: 240
    visible: true
    title: qsTr("Test Project")
    color: "#202020"

    Text {
        id: counterValueText
        text: "0"
        anchors.centerIn: parent
        color: "#ffffff"
        font.pointSize: 24
    }

    TestClass {
        id: testClass

        onCounterChanged: {
            counterValueText.text = testClass.counter;
        }
    }
}

testclass.h:

#ifndef TESTCLASS_H
#define TESTCLASS_H


#include <QObject>
#include <QTimer>



class TestClass : public QObject
{
    Q_OBJECT
public:
    explicit TestClass(QObject *parent = nullptr);

    Q_PROPERTY(int counter READ getCounter NOTIFY counterChanged);
    int getCounter();

signals:
    void counterChanged();

private slots:
    void timeoutOccured();

private:
    int counter;
    QTimer *timer;

};



#endif // TESTCLASS_H

testclass.cpp:

#include "testclass.h"



constexpr int periodMs = 50;



TestClass::TestClass(QObject *parent) : QObject(parent),
    counter(0)
{
    timer = new QTimer(this);
    QObject::connect(timer, &QTimer::timeout, this, &TestClass::timeoutOccured);
    timer->start(periodMs);
}



int TestClass::getCounter()
{
    return counter;
}



void TestClass::timeoutOccured()
{
    counter++;
    emit counterChanged();
}

Проект: ссылка.

 

 

 

ОтветитьЦитата
Размещено : 17.05.2022 13:53
TheRoslyak
(@theroslyak)
Active Member

@aveal 

Спасибо! Помогло!

Сам бы точно не догадался:-)

ОтветитьЦитата
Topic starter Размещено : 18.05.2022 15:05
Aveal
(@aveal)
Illustrious Member Admin

@theroslyak Нет проблем, рад, что помогло )

ОтветитьЦитата
Размещено : 18.05.2022 16:57
Поделиться: