Виталий Антипов22. Juli 2017 07: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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
sf
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
МВ
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
ЛС
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Letzte Kommentare
ИМ
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5. Oktober 2024 07:51
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5. Februar 2024 01:50
EVA25. Dezember 2023 10:30
Jetzt im Forum diskutieren
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3. Oktober 2024 04:05
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
Кирилл Гусарев27. September 2024 09:09
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
Попробовал через QQmlContext - результат тот же. В console.log("skz = ", skz) вижу что данные в qml приходят как задумано, но обновление текста в TextField происходит только после окончания работы функции. И при попытке цикл выполнить в qml даже с насильным textX.update() не приводит к желаемому результату.
День добрый.
Да, сигнально-слотовое соединение построил по вашим урокам. Таймер через qDebug показывает, что на взятие 2048 сигналов с датчика уходит 1000 мс. qDebug совместно с console.log из QML показывают новые данные раз в секунду как и задумано, не заметить изменения как-то сложно.
А вы не пробовали вставлять сигнал или выставление text через setProperty внутри цикла, где забираете значения с шины данных?
У меня в главный цикл (цикл количества измерений) вложены два последовательных (цикл сбора данных и цикл обработки данных). setProperty (или emit sendToQml в случае использования context) вызывается в конце главного цикла.