Виталий Антипов22 июля 2017 г. 7:26
Передача данных из цикла С++ в 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 } }
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD
- Akiv Doros
- 11 ноября 2024 г. 23:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
m
- molni99
- 26 октября 2024 г. 9:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
m
- molni99
- 26 октября 2024 г. 9:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Последние комментарии
Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
Сейчас обсуждают на форуме
добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
Всё ещё разбираюсь с кешем. 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
IscanderChe31 октября 2024 г. 23:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3 октября 2024 г. 12:05
Попробовал через QQmlContext - результат тот же. В console.log("skz = ", skz) вижу что данные в qml приходят как задумано, но обновление текста в TextField происходит только после окончания работы функции. И при попытке цикл выполнить в qml даже с насильным textX.update() не приводит к желаемому результату.
День добрый.
Да, сигнально-слотовое соединение построил по вашим урокам. Таймер через qDebug показывает, что на взятие 2048 сигналов с датчика уходит 1000 мс. qDebug совместно с console.log из QML показывают новые данные раз в секунду как и задумано, не заметить изменения как-то сложно.
А вы не пробовали вставлять сигнал или выставление text через setProperty внутри цикла, где забираете значения с шины данных?
У меня в главный цикл (цикл количества измерений) вложены два последовательных (цикл сбора данных и цикл обработки данных). setProperty (или emit sendToQml в случае использования context) вызывается в конце главного цикла.