如何从UART获得2D数组到QList Qt并在QML上设置文本

问题描述 投票:0回答:1

我从Arduino收到了UART发送的2D数组。我可以在调试中显示它,但不能将其保存在QList变体中以为QML中的矩形矩阵设置文本。

我想在每个矩形的QML上显示文本。

我该怎么办?

这是Arduino代码。我发送2d数组17x17

void setup(){
    pinMode(LED_BUILTIN,OUTPUT);
    analogWrite(LED_BUILTIN,255);
    Serial.begin(115200);
void loop(){
    double data[17][17];
    if(Serial.available()){
        delay(100);
        for(int i=0; i<17; i++){
            for(int j=0; j<17; j++){
                data[i][j] = i+j+0.01;
                sendData(data[i][j]);
                delay(10);
            }
        }
    }
    return;
}

void sendData(double data){
    Serial.print((data));
}

这是readSerial函数:

void serial::readSerial(){
    serialData = arduino.readAll();
    qDebug()<< serialData <<"\n"; 
}

QML文件:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 17*square_size
    height: 17*square_size
    title: qsTr("Hello World")
    property int  square_size: 30
    Grid {
        id: grid
        columns: 17
        Repeater{
            id: rpt
            model: 17*17
            Rectangle{
                width: square_size
                height: square_size
                border.color: "black"
                border.width: 1

                Text {
                    anchors.centerIn: parent
                    text: Serial.model_data[index]
                }
            }
        }
    }
}

serial.h:

#include <QQmlApplicationEngine>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QtDebug>
class serial: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<QString> text READ text  NOTIFY textChanged)

public:
    explicit serial(QQmlApplicationEngine *engine, QObject *parent = nullptr);
    ~serial();
    void setupSerial();

    Q_INVOKABLE QList<QString> text(){
        return m_text;
    }

private slots:
    void readSerial();
private:
    QQmlApplicationEngine* m_engine;

/* Varian of Arduino*/
    QSerialPort arduino;
    bool arduino_is_avaiable;
    QString portName;
    QByteArray serialData;

/*Varian of text*/
    QList<QString> m_text;
signals:
    void textChanged();

public slots:

};

#endif // SERIAL_H

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "serial.h"

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

    QQmlApplicationEngine engine;
    serial myserial(&engine);
    engine.rootContext()->setContextProperty("Serial", &myserial);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}
qt qml uart qlist qiodevice
1个回答
0
投票

我认为您缺少Serial类的属性来读取数据:text: Serial.model_data[index]。要在屏幕上显示某些内容,最快的解决方案是添加该属性并按如下所示进行填充:

Serial.h(我遗漏了一些内容)

class Serial : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QVariantList model_data READ model_data NOTIFY modelDataChanged)

public:
    explicit Serial(QObject *parent = nullptr);

    QVariantList model_data() const { return model_data_; }

signals:
    void modelDataChanged();

private slots:
    void readSerial();

private:
    QVariantList model_data_;
};

readSerial()函数如下所示:

void Serial::readSerial()
{
    QByteArray serialData = QByteArray(17 * 17 * 8, 0); //shortcut for testing

    double *arr = reinterpret_cast<double*>(serialData.data());
    model_data_.clear();
    for(int i=0;i<17*17;i++)
    {
        model_data_.append(arr[i]);
    }
    emit modelDataChanged();
}

发生的情况是QVariant列表中充满了双打,而双打已从字节重新解释为双打。请注意,每次serialData更改时都必须执行此操作。

但是,如果您想进一步了解,这可能不是理想的。更改尺寸时,此设置将在arduino发送端,arduino读取端和qml端均失败。您应该考虑发送数组的尺寸,向后读取尺寸并对其进行操作。一种想法可能是QAbstractListModel,它已经具有行/列的概念。另一个更简单的想法可能是在Serial类中添加说明尺寸的属性(在readSerial()中读取)[]

© www.soinside.com 2019 - 2024. All rights reserved.