【发布时间】:2021-01-04 01:38:15
【问题描述】:
我正在使用 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, 0, "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
【问题讨论】:
-
完成。对不起,谢谢!
-
为什么
incoming::readSerial会创建一个全新的incoming实例? -
那是一位试图帮助我的朋友留下的。我已经删除了它。老实说,我对基本的了解很少。我大约 4 周前才开始使用 cpp。
标签: qt qml qtserialport