微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 QML 属性链接到 QSerial 输出

如何解决将 QML 属性链接到 QSerial 输出

我正在使用 Qt 教程创建一个仪表集群。我已经完成了所有这些步骤并完成了视觉方面的工作,所以现在我处于编码方面并且完全绿色。

设置是 Arduino 向 RaspBerry Pi 发送数据。我正在尝试获取该数据并将其发送到我的 QML 以更新 QML 中的“rpmFrame”。作为一个实验,我让 Arduino 只发送“800”,但我无法让仪表以任何容量显示它(数据完美没问题,我已将其分配给双“rpmDouble”。)我有多次尝试传入:: valuetoQML 在调试中显示800,但它从未转换为QML。我认为我对所有变量如何跨标题等工作的基本理解很差。

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Timeline 1.0
import incoming 1.0

Window {
    width: 1280
    height: 480
    visible: true
    color: "#FFFFFF"

SerialIncoming{
        id:incoming
}
    Rectangle {
        id: rectangle
        x: 0
        y: -7
        width: 1280
        height: 487
        color: "#ffffff"
    }

        Rectangle {
            id: oil
            x: 331
            y: 52
            width: 69
            height: 47
            color: "#ff0000"
        }

        Rectangle {
            id: battery
            x: 405
            y: 52
            width: 74
            height: 47
            color: "#ff0000"
        }

        Rectangle {
            id: leftturn
            x: 360
            y: 105
            width: 69
            height: 47
            color: "#15ff0d"
        }

        Rectangle {
            id: hibeam
            x: 807
            y: 65
            width: 69
            height: 47
            color: "#00caff"
        }

        Rectangle {
            id: brake
            x: 881
            y: 64
            width: 74
            height: 47
            color: "#ff0000"
        }

        Rectangle {
            id: rightturn
            x: 852
            y: 117
            width: 69
            height: 47
            color: "#15ff0d"
        }

        Rectangle {
            id: oil1
            x: 369
            y: 386
            width: 69
            height: 47
            color: "#ff0000"
        }

    Tachometer {
        id: tachometer
        x: 423
        y: 27
        rpmFrame: {incoming.valuetoQML} // <-- this is where serial data goes
        displaySpeed: "500"
        scale: 0.9

    }




}

传入.cpp

incoming::incoming(QObject *parent) : QObject(parent) {

    arduino = new QSerialPort(this);
    serialBuffer="";

    arduino->setPortName("ttyACM0");
    arduino->setBaudrate (QSerialPort::Baud9600);
    arduino->setDataBits (QSerialPort::Data8);
    arduino->setParity(QSerialPort::noparity);
    arduino->setStopBits(QSerialPort::Onestop);
    arduino->setFlowControl (QSerialPort::NoFlowControl);
    arduino->open(QSerialPort::ReadOnly);
    QObject::connect(arduino,SIGNAL(readyRead()),this,SLOT(readSerial()));
    qDebug() << "KenDash v0.0";


}

void incoming::readSerial()
{
    //Buffer to Filter Data
    if(arduino->bytesAvailable()>0||arduino->waitForReadyRead(10))
    {
    QStringList bufferSplit = serialBuffer.split(",");

    if(bufferSplit.length() < 5)
        {
    QByteArray serialData = arduino->readAll();
    serialBuffer += QString::fromStdString(serialData.toStdString());
    serialData.clear();
        }else{
    //Clean Data Output
    serialBuffer="";
    QString serialOutput = bufferSplit[1];

    //Split the Clean Data To Sections
    QStringList dataSplit = bufferSplit[1].split("/");
    QString rpmOutput = dataSplit[0];
    QString speedOutput = dataSplit[1];

    //qDebug() << "RPM:" << rpmOutput << "Speed:" << speedOutput;

    rpmDouble = rpmOutput.todouble();


    incoming *myinstance = new incoming;
    QObject *object = myinstance;

   object->setProperty("valuetoQML",rpmDouble);
   //Read Data in Debug Panel
   qDebug() << "RPM(onheader2):" << incoming::valuetoQML();
        }
    }



}

main.cpp

        #include "incoming.h"
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QDebug>
    
    
    int main(int argc,char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QGuiApplication app(argc,argv);
        qmlRegisterType<incoming>("incoming",1,"SerialIncoming");
        QQmlApplicationEngine engine;
    
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        QObject::connect(&engine,&QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj,const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        },Qt::QueuedConnection);
        engine.load(url);
        void incomingserial();
        return app.exec();
    
    }

传入.h

  #ifndef INCOMING_H
#define INCOMING_H

#pragma once
#include <QString>
#include <QSerialPort>
#include <QDebug>
#include <QObject>
#include <iostream>


void incomingserial();

class incoming : public QObject
{
    Q_OBJECT
    Q_PROPERTY(double valuetoQML READ valuetoQML WRITE setValuetoQML NOTIFY valuetoQMLChanged)

public:

    explicit incoming(QObject *parent = 0);
    //~incoming();
    double valuetoQML() const
    { return rpmDouble;}
    void setValuetoQML(double valuetoQML)
    {
        _valueString = valuetoQML;
        emit valuetoQMLChanged(valuetoQML);
    }


signals:
    void valuetoQMLChanged(double);

private slots:
        void readSerial();

private:
    double _valueString;
    QSerialPort *arduino;
    static const quint16 arduino_uno_vendor_id = 9025;
    static const quint16 arduino_uno_product_id = 67;
    QByteArray serialData;
    QString serialBuffer;
    QString parsed_data;
    double rpmtachOutput;
    double rpmDouble;
    QString rpmOutput;
    double rpmTodisplay();

};




#endif // INCOMING_H

解决方法

我不明白为什么您将新传入的值设置为 _valueString,但您从 rpmDouble 读取了该值。您的 QProperty 读写函数应该引用相同的变量,因此当某些东西来自串行时,您应该调用:

this->setValuetoQML(rpmOutput.toDouble());

setValuetoQML 函数内部,像这样分配新值:

rpmDouble = valueToQML;

因为当调用 valueToQML() 时,您将返回 rpmDouble

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。