Виталий АнтиповJuly 22, 2017, 7:26 a.m.
Передача данных из цикла С++ в QML
Здравствуйте! У меня следующая задача: с датчика mpu6050 передать данные ускорения восьми измерений подряд на ODROID XU4, вычислить СКЗ каждого измерения и последовательно передать их в QML в поле TextField. Ниже представленный код работает отлично, вот только в поле TextField отображается лишь СКЗ последнего измерения, а хотелось бы визуально наблюдать изменения от замера к замеру с перспективой построения графика в реальном времени. Прошу помощи.
main.cpp dataport.h
#include <QQmlApplicationEngine> #include <QApplication> #include <QObject> #include <QDebug> #include <QQmlContext> #include "dataport.h" int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QLatin1String("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; QObject* root = engine.rootObjects().first(); dataport *port = new dataport(root); QObject::connect(root, SIGNAL(startSignal()), port, SLOT(start())); return app.exec(); }
#ifndef DATAPORT_H #define DATAPORT_H #include <QObject> #include <QDebug> #include <QTime> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <errno.h> #include <string.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <string.h> #include <time.h> #define I2C_SLAVE 0x0703 #define I2C_SMBUS 0x0720 #define I2C_SMBUS_READ 1 #define I2C_SMBUS_WRITE 0 #define I2C_SMBUS_QUICK 0 #define I2C_SMBUS_BYTE 1 #define I2C_SMBUS_BYTE_DATA 2 #define I2C_SMBUS_WORD_DATA 3 #define I2C_SMBUS_PROC_CALL 4 #define I2C_SMBUS_BLOCK_DATA 5 #define I2C_SMBUS_I2C_BLOCK_BROKEN 6 #define I2C_SMBUS_BLOCK_PROC_CALL 7 #define I2C_SMBUS_I2C_BLOCK_DATA 8 #define I2C_SMBUS_BLOCK_MAX 32 #define I2C_SMBUS_I2C_BLOCK_MAX 32 class dataport : public QObject { Q_OBJECT public: explicit dataport(QObject *parent = 0); signals: //void sendToQml(QString skz); public slots: void start(); private: QString dataX; int i,k,l; int16_t val1, val2; int accX; double massive[2048]; double massiveX[2048]; char ch1, ch2; double sumkv; double sum; QString skz; union i2c_smbus_data { uint8_t byte; uint16_t word; uint8_t block [I2C_SMBUS_BLOCK_MAX + 2] ; }; struct i2c_smbus_ioctl_data { char read_write; uint8_t command ; int size; union i2c_smbus_data *data; }; static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args ; args.read_write = rw ; args.command = command ; args.size = size ; args.data = data ; return ioctl (fd, I2C_SMBUS, &args) ; } int i2c_smbus_read_byte_data(int fd, int reg) { union i2c_smbus_data data; if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data)) return -1 ; else return data.byte & 0xFF ; } void data_update (void); int system_init(void); const char *i2cHandleNode = "/dev/i2c-1"; int i2c_fd = -1; }; #endif // DATAPORT_H
#include "dataport.h" dataport::dataport(QObject *parent) : QObject(parent) { } void dataport::data_update(void) { if(ioctl(i2c_fd, I2C_SLAVE, 0x68) < 0) { fprintf(stdout, "%s : ioctl I2C_SLAVE Setup Error!\n", __func__); return; } ch1 = i2c_smbus_read_byte_data(i2c_fd, 0x3b); ch2 = i2c_smbus_read_byte_data(i2c_fd, 0x3c); val1 = ch1<<8|ch2; } int dataport::system_init(void) { if((i2c_fd = open(i2cHandleNode, O_RDWR)) < 0) { fprintf(stdout, "%s : %s Open Error!\n", __func__, i2cHandleNode); return -1; } return 0; } void dataport::start() { QObject* textX1 = this->parent()->findChild<QObject*>("textX"); if (system_init() < 0) { fprintf (stderr, "%s: System Init failed\n", __func__); fflush(stdout); //return -1; } for(l=0;l<8;l++){ QTime start = QTime::currentTime(); for(i=0;i<2048;i++){ usleep(70); if(ioctl(i2c_fd, I2C_SLAVE, 0x68) < 0) { fprintf(stdout, "%s : ioctl I2C_SLAVE Setup Error!\n", __func__); return; } ch1 = i2c_smbus_read_byte_data(i2c_fd, 0x3b); ch2 = i2c_smbus_read_byte_data(i2c_fd, 0x3c); val1 = ch1<<8|ch2; massive[i]=val1; } qDebug()<< "time "<< start.elapsed(); sumkv = 0; for(k=0;k<2048;k++){ massiveX[k]=(fabs(massive[k]/16384) - 1)*9.81; sum = massiveX[k]*massiveX[k]; sumkv = sumkv + sum; } qDebug()<<massive[15]; qDebug()<<massiveX[15]; skz = QString::number(sqrt(sumkv/2048));///(l+1); qDebug()<<skz; textX1->setProperty("text",skz); } }
import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.3 import QtCharts 2.0 ApplicationWindow { id: tex objectName: "tex" visible: true width: 640 height: 480 title: qsTr("TEST2") signal startSignal() Button{ text: "START" onClicked: startSignal() } TextField{ id: textX objectName: "textX" width: parent.width/3 height: parent.height/10 anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top } Text { id: textXx objectName: "textXx" //text: qsTr("text") } ChartView{ title: "SKZ" anchors.top: textX.bottom anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom antialiasing: true } }
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
AD
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
m
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
m
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Last comments
Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
Now discuss on the forum
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
IscanderCheOct. 31, 2024, 3:43 p.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь МаксимовOct. 3, 2024, 4:05 a.m.
Попробовал через QQmlContext - результат тот же. В console.log("skz = ", skz) вижу что данные в qml приходят как задумано, но обновление текста в TextField происходит только после окончания работы функции. И при попытке цикл выполнить в qml даже с насильным textX.update() не приводит к желаемому результату.
День добрый.
Да, сигнально-слотовое соединение построил по вашим урокам. Таймер через qDebug показывает, что на взятие 2048 сигналов с датчика уходит 1000 мс. qDebug совместно с console.log из QML показывают новые данные раз в секунду как и задумано, не заметить изменения как-то сложно.
А вы не пробовали вставлять сигнал или выставление text через setProperty внутри цикла, где забираете значения с шины данных?
У меня в главный цикл (цикл количества измерений) вложены два последовательных (цикл сбора данных и цикл обработки данных). setProperty (или emit sendToQml в случае использования context) вызывается в конце главного цикла.