Arduino analog input to QT Gauge.
-
What errors is it emitting ?
-
C:\Users\Stephn\Documents\300zx\dialog.cpp:37: error: no matching function for call to 'Dialog::connect(QDialog*&, const char*, QQuickItem*&, const char*)'
QObject::connect(Dialog, SIGNAL(oil_pressure_bar(QVariant)),Rectangle, SLOT(needleAngle(QVariant)));
^This is the error I'm getting. much appreciated.
-
You are trying to connect classes. You have to connect instances of these classes.
-
And by classes you mean "dialog" when I should be connecting " updatedoilpress"?
And instead of "Rectangle" I should be connecting Rotation"?Also would this QObject::Connect be the easiest and simplest way of connecting a C++ signal (analogread2, oil_press_bar) to a QML Slot (Neeedle, needleAngle)?
-
You'd have to search for the objects you are interest in in your engine and then connect them.
By the way, why not make this dialog also with QtQuick ?
-
Ok so id search for the instances, I can google how to do that.
What are the benefits of using QtQuick, over my method?
-
That was just curiosity. Nothing wrong in mixing both. If you go with a QtQuick only GUI you should be able to drop the dependency on the QtWidgets module which makes your application lighter weight.
-
Hi,
I took your advice and used the cpp for serial data collection and the qml for the GUI, but I'm having a problem with this error.
C:\Users\Stephn\Documents\nissan300zx\serialport.h:50: error: 'double SerialPort::oil_pressure_volt' conflicts with a previous declaration
double oil_pressure_volt;
^I know that the code is duplicating names, but id like to read that name in Q_Property and then send it to QML.
#ifndef SERIALPORT_H #define SERIALPORT_H #include <QObject> #include <QQuickItem> #include <QSerialPort> #include <QSerialPortInfo> #include <QByteArray> class SerialPort : public QObject { Q_OBJECT Q_PROPERTY(QString oil_pressure_volt READ oil_pressure_volt WRITE set_oil_pressure_volt NOTIFY oil_pressure_volt_Changed) public: SerialPort(QObject *parent = 0); SerialPort(QString); QString oil_pressure_volt() const { return m_oil_pressure_volt; } public slots: void analogRead2(); void updateOilPressure(QString); void set_oil_pressure_volt(QString oil_pressure_volt) { if (m_oil_pressure_volt == oil_pressure_volt) return; m_oil_pressure_volt = oil_pressure_volt; emit oil_pressure_volt_Changed(oil_pressure_volt); } signals: void oil_pressure_volt_Changed(QString oil_pressure_volt); private: QSerialPort *arduino; static const quint16 arduino_uno_vendor_id = 0x2341; static const quint16 arduino_uno_product_id = 0x0001; QByteArray serialData; QString serialBuffer; QString parsed_data; double oil_pressure_volt; QString m_oil_pressure_volt; }; #endif // SERIALPORT_H
Could I rename the oil_pressure_volt in the CPP
void SerialPort::updateOilPressure(QString sensor_reading) { //oil_pressure_volt(double) = data; }
-
Why are you declaring a oil_pressure_volt property QString then the matching variable as double and still use QString everywhere ?
-
Sorry, that was me trying different ideas out.
#ifndef SERIALPORT_H #define SERIALPORT_H #include <QObject> #include <QQuickItem> #include <QSerialPort> #include <QSerialPortInfo> #include <QByteArray> class SerialPort : public QObject { Q_OBJECT Q_PROPERTY(double oil_pressure_volt READ oil_pressure_volt WRITE set_oil_pressure_volt NOTIFY oil_pressure_volt_Changed) public: SerialPort(QObject *parent = 0); SerialPort(QString); double oil_pressure_volt() const { return m_oil_pressure_volt; } public slots: void analogRead2(); void updateOilPressure(QString); void set_oil_pressure_volt(double oil_pressure_volt) { if (m_oil_pressure_volt == oil_pressure_volt) return; m_oil_pressure_volt = oil_pressure_volt; emit oil_pressure_volt_Changed(oil_pressure_volt); } signals: void oil_pressure_volt_Changed(double oil_pressure_volt); private: QSerialPort *arduino; static const quint16 arduino_uno_vendor_id = 0x2341; static const quint16 arduino_uno_product_id = 0x0001; QByteArray serialData; QString serialBuffer; QString parsed_data; double oil_pressure_volt; double m_oil_pressure_volt; }; #endif // SERIALPORT_H This is the error, C:\Users\Stephn\Documents\nissan300zx\serialport.h:48: error: 'double SerialPort::oil_pressure_volt' conflicts with a previous declaration double oil_pressure_volt; ^
-
Hi, So after making a few suggested changes I cant now display a "0" on my qml text field, I think this zero is the first reading of the analogRead 2.
I changed to this in the main.
engine.rootContext()->setContextProperty("serialport", &serialport);
and this in the header.
Q_PROPERTY( double oilPressureVoltage MEMBER m_oil_pressure_volt WRITE set_oil_pressure_volt NOTIFY oil_pressure_volt_Changed )
I think I need to add some code into a string,
#ifndef SERIALPORT_H #define SERIALPORT_H #include <QObject> #include <QQuickItem> #include <QSerialPort> #include <QSerialPortInfo> #include <QByteArray> class SerialPort : public QObject { Q_OBJECT Q_PROPERTY( double oilPressureVoltage MEMBER m_oil_pressure_volt WRITE set_oil_pressure_volt NOTIFY oil_pressure_volt_Changed ) public: SerialPort(QObject *parent = 0); SerialPort(QString); public slots: void analogRead2(); void updateOilPressure(QString); void set_oil_pressure_volt(double oilPressureVoltage) { if (m_oilPressureVoltage == oilPressureVoltage) return; m_oilPressureVoltage = oilPressureVoltage; emit oil_pressure_volt_Changed(oilPressureVoltage); } signals: void oil_pressure_volt_Changed(double oilPressureVoltage); private: QSerialPort *arduino; static const quint16 arduino_uno_vendor_id = 0x2341; static const quint16 arduino_uno_product_id = 0x0001; QByteArray serialData; QString serialBuffer; QString parsed_data; double oil_pressure_volt; double m_oilPressureVoltage; }; #endif // SERIALPORT_H
-
Can you how how you are using that class in QML ?
-
yes its...
import QtQuick 2.5 import QtQuick.Window 2.2 import QtQuick.Extras 1.4 import QtQuick.Controls 2.0 import SerialPortlib 1.0 Window { id: gauge visible: true width: 640 height: 480 TextEdit { id: textEdit text: SerialPort.newValue verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignCenter } } and...
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
SerialPort serialport;
qmlRegisterType<SerialPort>("SerialPortlib", 1, 0, "SerialPort");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));return app.exec();
-
What's that
newValue
?You seem to be trying to use a
SerialPort
object but you are currently accessing it's class (or Type in QML).You either need to create a SerialPort object in QML or give an instance from it to the engine.
Did you already read the QML CPP integration chapter of Qt's documentation ?
-
I tried to create an object by doing;
import QtQuick 2.5 import QtQuick.Window 2.2 import QtQuick.Extras 1.4 import QtQuick.Controls 2.0 import SerialPortlib 1.0 Window { visible: true width: 640 height: 480 id: gauge SerialPort{ OnOil_pressure_volt_Changed:(console.log(newValue)); } }
with no joy, is this what your referring too?
-
Your QML slot name is wrong.
AFAIK it should be
onOil_pressure_volt_changed
Note that Qt's naming style is camelCase, that might help you match your code with the documentation.You should maybe take a look at http://qmlbook.org
-
Ahh thank you, that was an interesting read, ive achieved what I wanted.
-
Great !
In that case, please mark the thread as solved using the "Topic Tools" button so that other forum users may know a solution has been found :)