Форум программистов, компьютерный форум, киберфорум
QML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
1

Передача данных из *.cpp в *.qml

13.12.2017, 22:28. Показов 6678. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста как передать данные из *.cpp в *.qml
в *.cpp я получаю данные с порта
C++ (Qt)
1
2
3
4
5
6
7
8
9
void SerialPort::onReadData()
{
    if(arduino->bytesAvailable()>0){
 
        QByteArray data = arduino->readAll();
// qDebug()<<QString(data).trimmed(); // показать в терминале
        QString value = QString(data).trimmed(); // тут данные в виде 8,6,3,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255
    }
}
Как в *.qml
вывести их
C++ (Qt)
1
2
3
4
5
6
7
property variant sourceData: [QString(data).trimmed()]
SerialPort {
        onSerial_dataChanged: {
            sourceData: "%1".arg(serial_data).split(',')
 
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2017, 22:28
Ответы с готовыми решениями:

Передача параметра из .cpp в .qml
По COM порту получаю строку вида 0,0,999,000000110: , 12 чисел, первые 3 разделяются запятыми,...

Передача данных из строки в таблицу Qt 5.3, QML 2.0
Привет всем. Возникла проблемка. Как передать данные из поля TextInput в таблицу? main.qml такой ...

Передача данных типа Qvector в QML ChartView
Всем привет. У меня возникла такая проблема, не могу понять как через сигналы перекинуть из одного...

Связка qml и cpp
Доброго времени суток! Помтавили задачу написать приложение, ввбор пал на qt, так как в далекие...

9
Заблокирован
13.12.2017, 22:34 2
в QML нужно отобразить строку из CPP?
0
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
13.12.2017, 22:37  [ТС] 3
Ну как бы да...
Передать данные с cpp QString value = QString(data).trimmed();
в QML property variant sourceData: [ СЮДА ]
0
Заблокирован
13.12.2017, 22:48 4
Цитата Сообщение от AdDa Посмотреть сообщение
в QML property variant sourceData: [ СЮДА ]
Да всё не правильно, в общем накидал тебе простую демку, разбирайся.
Как работает?
1. Твой CPP класс должен быть как минимум унаследован от QObject-а
2. Регистрируешь его для QML в main.cpp (qmlRegisterType)
3. Определяешь его в QML
4. А, ну да, для удобства в CPP классе делаешь Q_PROPERTY строкового типа
5. Всё, используешь этот класс в QML как хочешь, точнее его свойство со строкой
Вложения
Тип файла: rar CppToQmlDemo.rar (4.8 Кб, 64 просмотров)
0
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
13.12.2017, 23:15  [ТС] 5
Спасибо, сейчас попробую...

Добавлено через 24 минуты
Что то не получается
serialport.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef SERIALPORT_H
#define SERIALPORT_H
 
#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
 
class SerialPort : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString serial_data READ get_serial_data WRITE set_serial_data NOTIFY serial_data_Changed )
 
public:
    SerialPort(QObject *parent = 0);
    ~SerialPort();
 
    QString get_serial_data() const;
    void set_serial_data(QString newValue);
 
public slots:
    void onReadData();
 
signals:
    void serial_data_Changed(QString newValue);
 
private:
    QSerialPort *arduino;
    static const quint16 arduino_uno_vendor_id = 0x2341;
    static const quint16 arduino_uno_product_id = 0x0001;
 
    QString mserial_data;
 
    QSerialPortInfo portInfo;
 
    void openDefault();
};
 
#endif // SERIALPORT_H
serialport.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "serialport.h"
#include <QDebug>
 
SerialPort::SerialPort(QObject *parent):QObject(parent)
{
    arduino = new QSerialPort(this);
    connect(arduino, &QSerialPort::readyRead, this, &SerialPort::onReadData);
    openDefault();
}
 
SerialPort::~SerialPort()
{
    delete arduino;
}
 
void SerialPort::set_serial_data(QString newValue)
{
    if (mserial_data == newValue)
        return;
 
    mserial_data = newValue;
    emit serial_data_Changed(mserial_data);
}
 
void SerialPort::onReadData()
{
    if(arduino->bytesAvailable()>0){
 
        QByteArray data = arduino->readAll();
 qDebug()<<QString(data).trimmed();
        QString value = QString(data).trimmed(); 
    }
}
 
 
void SerialPort::openDefault()
{
    arduino->setPortName("COM3");
    arduino->setBaudRate(QSerialPort::Baud115200);
    arduino->setDataBits(QSerialPort::Data8);
    arduino->setParity(QSerialPort::NoParity);
    arduino->setStopBits(QSerialPort::OneStop);
    arduino->setFlowControl(QSerialPort::NoFlowControl);
 
    if(arduino->open(QSerialPort::ReadWrite))
        qDebug()<<"Connected to "<< "COM3";
    else
        qCritical()<<"Serial Port error: " << arduino->errorString();
 
}
QString SerialPort::get_serial_data() const
{
    return mserial_data;
}
main.qml
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import QtQuick 2.8
import QtQuick.Window 2.2
 
import SerialPortLib 1.0
 
Window {
    id: dash
    visible: true
    width: 1280
    height: 480
    color: "grey"
    title: qsTr("Amigo")
///Как сюда что то передать.... ?
    property variant sourceData: [ 238,63,2123,99000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255]
 
 
    SerialPort {
        onSerial_dataChanged: {
            sourceData: "%1".arg(serial_data).split(',')
 
        }
    }
}
0
Заблокирован
13.12.2017, 23:41 6
Цитата Сообщение от AdDa Посмотреть сообщение
Что то не получается
Что конкретно? Я же в демке показал как надо и написал пояснение
C++ (Qt)
1
Q_PROPERTY(QString serial_data READ get_serial_data WRITE set_serial_data NOTIFY serial_data_Changed
А где реализация get_serial_data, set_serial_data?
Жми правой кнопкой на Q_PROPERTY и выбирай там что-то вроде сгенерировать недостающие...

Где объект класса SerialPort создаётся? Он может быть создан в другом месте, допустим в QML? (если нет - обоснуй, почему)
0
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
13.12.2017, 23:58  [ТС] 7
Цитата Сообщение от Digital_Cry Посмотреть сообщение
Жми правой кнопкой на Q_PROPERTY и выбирай там что-то вроде сгенерировать недостающие...
Досоздалось -
C++ (Qt)
1
QString m_serial_data;
Цитата Сообщение от Digital_Cry Посмотреть сообщение
Где объект класса SerialPort создаётся?
В main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
 
#include "serialport.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
 
    QQmlApplicationEngine engine;
 
    qmlRegisterType<SerialPort>("SerialPortLib", 1, 0, "SerialPort");
 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
 
    return app.exec();
}
Цитата Сообщение от Digital_Cry Посмотреть сообщение
А где реализация get_serial_data, set_serial_data?
в файле serial.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
QString SerialPort::get_serial_data() const
{
    return mserial_data;
}
void SerialPort::set_serial_data(QString newValue)
{
    if (mserial_data == newValue)
        return;
 
    mserial_data = newValue;
    emit serial_data_Changed(mserial_data);
}
0
Заблокирован
14.12.2017, 08:48 8
Держи ту же демку, только уже со встроенным твоим классом
Вложения
Тип файла: rar CppToQmlDemo.rar (5.1 Кб, 57 просмотров)
1
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
14.12.2017, 19:14  [ТС] 9
Спасибо, заработало )

Добавлено через 5 часов 40 минут
Пример заработал, все подставил в свой проект - запускается, данные читает , НО
То что было раньше
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
property variant sourceData:[ 238,63,2123,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255]
 
 SerialPort {
        onSerial_dataChanged: {
            sourceData: "%1".arg(serial_data).split(',')
        }
    }
Speed {
        id: speed
        anchors.centerIn: parent
        speed: sourceData[5]
    }
Мой Speed выводил 5 значение - 99, с вашей помощью и примером,я пришел к такому виду записи...
C++ (Qt)
1
 property variant sourceData:[cppClass.serial_data]
В текстовое поле данные выводятся - все нормально, но для Speed данных нету почему то
0
Заблокирован
15.12.2017, 08:17 10
Цитата Сообщение от AdDa Посмотреть сообщение
В текстовое поле данные выводятся - все нормально, но для Speed данных нету почему то
так я не понял, тебе что нужно выводить, строку или строковый массив? Если в строк у тебя массив, то какой разделитель? Запятая?
0
15.12.2017, 08:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2017, 08:17
Помогаю со студенческими работами здесь

Не компилируется Qt C++/QML Applications в Eclipse Cpp 2018-12
Добрый день! Я начал изучать C++, выбрав рабочим инструментом Eclipse 2018-12 с компилятором...

Qml изменение свойств Rectangle из main.cpp
Здравствуйте, такой вопрос, допустим у меня есть файл main.qml, с таким вот кодом: import QtQuick...

Передача параметра из QML в QT по клику
Всем привет, не так давно изучаю qml, хочу разобраться, как передать по клику на кнопку в qml слое...

Передача массива классов в QML
Собственно, подскажите как это сделать? Так как поиск в интернете, почти ничего не дал.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru