Updating c++ data in Qml
-
wrote on 26 Jul 2021, 14:24 last edited by dziko147
Hello , I diplay a Qml in a Qquickwidget .
1/I have a class called Backend witch send data to my Qml .
2/And i have a class called UploadCSV which send signal when button clicked to Slot in backend to start fill data .My problem is that I can't get data in QML file.
what is wrong in my code thank you :)
So this is my code :
In backend.hQ_PROPERTY(qreal valuespeed READ getValue WRITE setValue NOTIFY valueChanged) qreal getValue() {return m_Valuespeed;} void setValue(qreal value); qreal m_Valuespeed; void ValueChanged();
in Backend.cpp
void Backend::status() { m_Valuespeed=Outputs[0].toFloat(); qDebug() << "data" << m_Valuespeed; // here I get the right data } void Backend::setValue(qreal value) { qDebug("signal valuespeed called"); if(m_Valuespeed == value) return; m_Valuespeed = value; emit valueChanged(); }
In UploadCSV.cpp
Backend *back = new Backend(); // I think that this line is the problem ? connect(ui->parambtn_2, SIGNAL(clicked()),back , SLOT(status()),Qt::QueuedConnection);
In MainWindow.cpp
back = new Backend(); m_ui->quickWidget->rootContext()->setContextProperty("cppObject",back); m_ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); m_ui->quickWidget->setSource(QUrl(QStringLiteral("qrc:/qml/automotive.qml")));
In QML
value: cppObject.valuespeed
-
Hello , I diplay a Qml in a Qquickwidget .
1/I have a class called Backend witch send data to my Qml .
2/And i have a class called UploadCSV which send signal when button clicked to Slot in backend to start fill data .My problem is that I can't get data in QML file.
what is wrong in my code thank you :)
So this is my code :
In backend.hQ_PROPERTY(qreal valuespeed READ getValue WRITE setValue NOTIFY valueChanged) qreal getValue() {return m_Valuespeed;} void setValue(qreal value); qreal m_Valuespeed; void ValueChanged();
in Backend.cpp
void Backend::status() { m_Valuespeed=Outputs[0].toFloat(); qDebug() << "data" << m_Valuespeed; // here I get the right data } void Backend::setValue(qreal value) { qDebug("signal valuespeed called"); if(m_Valuespeed == value) return; m_Valuespeed = value; emit valueChanged(); }
In UploadCSV.cpp
Backend *back = new Backend(); // I think that this line is the problem ? connect(ui->parambtn_2, SIGNAL(clicked()),back , SLOT(status()),Qt::QueuedConnection);
In MainWindow.cpp
back = new Backend(); m_ui->quickWidget->rootContext()->setContextProperty("cppObject",back); m_ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); m_ui->quickWidget->setSource(QUrl(QStringLiteral("qrc:/qml/automotive.qml")));
In QML
value: cppObject.valuespeed
wrote on 26 Jul 2021, 14:46 last edited byYou have to call a handler in qml depending on the signal which is issued by the type you are using
like here: https://doc.qt.io/qt-5/qtqml-syntax-signals.html -
Hello , I diplay a Qml in a Qquickwidget .
1/I have a class called Backend witch send data to my Qml .
2/And i have a class called UploadCSV which send signal when button clicked to Slot in backend to start fill data .My problem is that I can't get data in QML file.
what is wrong in my code thank you :)
So this is my code :
In backend.hQ_PROPERTY(qreal valuespeed READ getValue WRITE setValue NOTIFY valueChanged) qreal getValue() {return m_Valuespeed;} void setValue(qreal value); qreal m_Valuespeed; void ValueChanged();
in Backend.cpp
void Backend::status() { m_Valuespeed=Outputs[0].toFloat(); qDebug() << "data" << m_Valuespeed; // here I get the right data } void Backend::setValue(qreal value) { qDebug("signal valuespeed called"); if(m_Valuespeed == value) return; m_Valuespeed = value; emit valueChanged(); }
In UploadCSV.cpp
Backend *back = new Backend(); // I think that this line is the problem ? connect(ui->parambtn_2, SIGNAL(clicked()),back , SLOT(status()),Qt::QueuedConnection);
In MainWindow.cpp
back = new Backend(); m_ui->quickWidget->rootContext()->setContextProperty("cppObject",back); m_ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); m_ui->quickWidget->setSource(QUrl(QStringLiteral("qrc:/qml/automotive.qml")));
In QML
value: cppObject.valuespeed
wrote on 26 Jul 2021, 15:18 last edited by@dziko147 I hope you are aware that
back
inUploadCSV.cpp
andMainWindow.cpp
are 2 different items!Another point: in
Backend::setValue()
you should use qFuzzyCompare to compare float/double value. -
wrote on 26 Jul 2021, 15:53 last edited by
@KroMignon as per usual :D I'm waiting for your response already :D .
Yes I understood that back in UploadCSV.cpp and MainWindow are 2 different Item .
I tried to get back from MainWindow (create instance of Mainwindow in UploadCSV) .
But didn't work .Please Can you suggest a way ?
-
@KroMignon as per usual :D I'm waiting for your response already :D .
Yes I understood that back in UploadCSV.cpp and MainWindow are 2 different Item .
I tried to get back from MainWindow (create instance of Mainwindow in UploadCSV) .
But didn't work .Please Can you suggest a way ?
wrote on 26 Jul 2021, 16:19 last edited by@dziko147 said in Updating c++ data in Qml:
Yes I understood that back in UploadCSV.cpp and MainWindow are 2 different Item .
I tried to get back from MainWindow (create instance of Mainwindow in UploadCSV) .
But didn't work .
Please Can you suggest a way ?It is very difficult/impossible for me to help you, because I don't understand what you are trying to do.
Please describe your use case. -
wrote on 26 Jul 2021, 16:35 last edited by
KroMignon i have a button in Uploadcsv ui . When is clicket a signal is emmitted to status slot in backend .
Value is defined in backend .
So qml should update the c++ data -
KroMignon i have a button in Uploadcsv ui . When is clicket a signal is emmitted to status slot in backend .
Value is defined in backend .
So qml should update the c++ datawrote on 26 Jul 2021, 16:39 last edited by@dziko147 said in Updating c++ data in Qml:
i have a button in Uploadcsv ui . When is clicket a signal is emmitted to status slot in backend .
Value is defined in backend .
So qml should update the c++ dataWhere do you create
UploadCSV
instance? -
wrote on 26 Jul 2021, 16:50 last edited by
@KroMignon No i didn't create a Uploadcsv instance ?
I dont need any uploadcsv instance -
@KroMignon No i didn't create a Uploadcsv instance ?
I dont need any uploadcsv instancewrote on 26 Jul 2021, 16:53 last edited by@dziko147 said in Updating c++ data in Qml:
I dont need any uploadcsv instance
And I don't understand what you are doing.
Sorry I give up. -
wrote on 26 Jul 2021, 17:07 last edited by
@KroMignon when signal emmited from uploadcsv there is a slot in backend witch fill data. Then i called a setprepertycontext in mainwindow which integrate backend in qml file
-
@KroMignon No i didn't create a Uploadcsv instance ?
I dont need any uploadcsv instanceHi,
@dziko147 said in Updating c++ data in Qml:
@KroMignon No i didn't create a Uploadcsv instance ?
I dont need any uploadcsv instanceIf you don't need any instance of that class then why do you have it in your code ?
From the code you posted, why do you have two Backend instances ? One in MainWindow and one in UploadCSV ?
-
wrote on 26 Jul 2021, 18:55 last edited by
@SGaist yes two instance of Backend class.
the first in UploadCSV.cpp to emit signal when button clickedBackend *back = new Backend(); // I think that this line is the problem ? connect(ui->parambtn_2, SIGNAL(clicked()),back , SLOT(status()),Qt::QueuedConnection);
the second in mainwindow.cpp to create a contextproperty :
back = new Backend(); m_ui->quickWidget->rootContext()->setContextProperty("cppObject",back);```
-
And you expect these two unrelated instances to communicate between different widgets from your UI ?
-
wrote on 26 Jul 2021, 19:04 last edited by
@SGaist said in Updating c++ data in Qml:
expect these two unrelated instances to communicate between different widgets from your UI ?
no I mentioned that these two instances cause a problem.
So can you suggest a way to do this !
BTW UploadCSV is a QDialog , Backend is QObject .
when I create instance in UploadCSV.h it cause problem !
-
Review your application architecture. There's an issue with what is created where and how they interact with each other.
You seem to have an issue with the proper composition of your various classes and GUI elements.
-
Yes there is and was already suggested in your other threads. You need to properly create your objects hierarchy.
You were creating a MainWidget object in your dialog trying to get data from it while it was in fact created by a different instance.
You seem to reproduce a similar scheme here.
-
@SGaist In my situation , when I would like to create an Backend instance in UploadCSV to emit signal .
And create Backend instance in MainWindow to set a contextProperty .
what should I do .
Please :)wrote on 27 Jul 2021, 05:17 last edited by@dziko147 said in Updating c++ data in Qml:
In my situation , when I would like to create an Backend instance in UploadCSV to emit signal .
And create Backend instance in MainWindow to set a contextProperty .
what should I do .
Please :)You should first explain why you think you have to create a Backend instance in UploadCSV?
It is impossible to understand (for me) what is the purpose of this.
And emitting a signal which is connected to nothing, results to nothing. -
wrote on 27 Jul 2021, 08:38 last edited by
@KroMignon in uploadcsv ui , i have a button . I want to emit clicked signal connected to a slot in backend which change data (see my code please) .
8/46