[solved] Newbie is confused.How to add dynamic data to TableView and parse through it send data to c++
-
I recently learned Model view programming in Qt. I want to implement a simple tableView.
Data will come from the user input so i have decided to implement my model also in qml.
Here is the code.import QtQuick 2.3 import QtQuick.Window 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 Window { visible: true width: Screen.width/2 height: Screen.height/2 ListModel{ id:setTableModel ListElement{ x_position: 100 y_position: 200 z_position: 300 velocity: 200 deceleration:300 tracking_x: 200 tracking_y:100 tracking_z:200 } ListElement{ x_position: 100 y_position: 200 z_position: 300 velocity: 200 deceleration:300 tracking_x: 200 tracking_y:100 tracking_z:200 } ListElement{ x_position: 100 y_position: 200 z_position: 300 velocity: 200 deceleration:300 tracking_x: 200 tracking_y:100 tracking_z:200 } } TableView{ id:setTableView // anchors.fill: parent model: setTableModel width: parent.width height: parent.height-buttons.height Layout.minimumWidth: 400 Layout.minimumHeight: 240 Layout.preferredWidth: 600 Layout.preferredHeight: 400 TableViewColumn { role: "x_position" title: "X mm" width: 80 } TableViewColumn { role: "y_position" title: "Y mm" width: 80 } TableViewColumn { role: "z_position" title: "Z mm" width: 80 } TableViewColumn { role: "velocity" title: "V m/s" width: 80 } TableViewColumn { role: "deceleration" title: "D m/s2" width: 80 } TableViewColumn { role: "tracking_x" title: "Tx mm" width: 80 } TableViewColumn { role: "tracking_y" title: "Ty mm" width: 80 } TableViewColumn { role: "tracking_z" title: "Tz mm" width: 80 } itemDelegate: Item { TextInput { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter renderType: Text.NativeRendering text: styleData.value } } } Row{ id:buttons anchors.top: setTableView.bottom Button{ id:addNewRowButton text: "ADD" onClicked: { //I dont know whether this is the efficient way to add dynamic row to the table.any suggestions please setTableModel.append({x_position: 0, y_position:0, z_position:0, velocity :0, deceleration:0, tracking_x:0, tracking_y:0, tracking_z:0} ) } } Button{ id:deleteRowButton text: "DELETE" onClicked: { setTableModel.remove(setTableView.currentRow) } } Button{ id:sendToCppButton text: "Send" onClicked: { // send all the data to cpp inorder to append to char array. var rows = []; for (var i = 0; i < setTableView.data.length; ++i) { rows = rows.concat(setTableView.data[i]); //don't know how to print the values on console and send the entire data to cpp side. console.log("values are"+rows[i]) } } } } }
Can any one tell me how to parse through each element and append some index number to it(so that c++ know from where it is coming) and send it to cpp side. Where the whole data is handled to send to contoller via Qtcpsocket.Thanks
-
Hi,
I suggest to use
JSON.stringify()
to have a JSON string from each record in the modelThis code
onClicked: { // send all the data to cpp inorder to append to char array. var rows = []; for (var i = 0; i < setTableModel.count; ++i) { var obj = JSON.stringify(setTableModel.get(i)); rows.push(obj) } console.log('We have ' + rows.length + ' rows') console.log(rows) }
prints
qml: We have 3 rows qml: [{"objectName":"","tracking_z":200,"tracking_y":100,"tracking_x":200,"deceleration":300,"velocity":200,"z_position":300,"y_position":200,"x_position":100},{"objectName":"","tracking_z":200,"tracking_y":100,"tracking_x":200,"deceleration":300,"velocity":200,"z_position":300,"y_position":200,"x_position":100},{"objectName":"","tracking_z":200,"tracking_y":100,"tracking_x":200,"deceleration":300,"velocity":200,"z_position":300,"y_position":200,"x_position":100}]
In C++ you'll receive a QList of QStrings that you can easily parse using the JSON module
-
Hi,
I suggest to use
JSON.stringify()
to have a JSON string from each record in the modelThis code
onClicked: { // send all the data to cpp inorder to append to char array. var rows = []; for (var i = 0; i < setTableModel.count; ++i) { var obj = JSON.stringify(setTableModel.get(i)); rows.push(obj) } console.log('We have ' + rows.length + ' rows') console.log(rows) }
prints
qml: We have 3 rows qml: [{"objectName":"","tracking_z":200,"tracking_y":100,"tracking_x":200,"deceleration":300,"velocity":200,"z_position":300,"y_position":200,"x_position":100},{"objectName":"","tracking_z":200,"tracking_y":100,"tracking_x":200,"deceleration":300,"velocity":200,"z_position":300,"y_position":200,"x_position":100},{"objectName":"","tracking_z":200,"tracking_y":100,"tracking_x":200,"deceleration":300,"velocity":200,"z_position":300,"y_position":200,"x_position":100}]
In C++ you'll receive a QList of QStrings that you can easily parse using the JSON module
@mcosta
Thanks a lot for the reply. I really don't know how to parse using the JSON module. I tried this way as per your hint.
In qml i have sent the whole rows to the backend.var rows = []; for (var i = 0; i < setTableModel.count; ++i) { var obj = JSON.stringify(setTableModel.get(i)); rows.push(obj); } SetTableDataHandling.datafromsetTableQml(rows);//Is this the right way to send?
where SetTableDataHandling is a registered c++ class.
In c++:void SetTableDataHandling::datafromsetTableQml(QList<QString> var) //Is this the right way to do? { //How exactly i should parse the data? qDebug()<<"received data "<<var.at(2); }
Thanks.
-
Hi,
you should use QJsonDocument to parse JSON strings
-
Hi,
you should use QJsonDocument to parse JSON strings
-
@mcosta
Is it correct the way how I access the Qml data in cpp?
void SetTableDataHandling::datafromsetTableQml(QList<QString> var) //Is this the right way to do?
@vishnu Actually you can directly access QML
ListModel
from C++. It can be casted intoQAbstractListModel
. Here is an example of how to access the data from C++QObject* root = engine.rootObjects().first(); //get the root object as usual QObject* list = root->findChild<QObject*>("myListview"); //get the ListView QVariant qmlmodel = list->property("model"); //access model property of ListView QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel int rows = model->rowCount(); //get number of rows from model //iterate through the model for (int i = 0; i<rows; i++) { for(int j = 0; j<model->roleNames().count(); j++) { //get the roles count qDebug() << model->index(i, 0).data(j); //get the actual data using roles } } //accessing roles for(int j = 0; j<model->roleNames().count(); j++) { qDebug() << model->roleNames()[j]; }
P.S: In your case it would be
TableView
. -
@vishnu Actually you can directly access QML
ListModel
from C++. It can be casted intoQAbstractListModel
. Here is an example of how to access the data from C++QObject* root = engine.rootObjects().first(); //get the root object as usual QObject* list = root->findChild<QObject*>("myListview"); //get the ListView QVariant qmlmodel = list->property("model"); //access model property of ListView QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel int rows = model->rowCount(); //get number of rows from model //iterate through the model for (int i = 0; i<rows; i++) { for(int j = 0; j<model->roleNames().count(); j++) { //get the roles count qDebug() << model->index(i, 0).data(j); //get the actual data using roles } } //accessing roles for(int j = 0; j<model->roleNames().count(); j++) { qDebug() << model->roleNames()[j]; }
P.S: In your case it would be
TableView
. -
@vishnu Actually you can directly access QML
ListModel
from C++. It can be casted intoQAbstractListModel
. Here is an example of how to access the data from C++QObject* root = engine.rootObjects().first(); //get the root object as usual QObject* list = root->findChild<QObject*>("myListview"); //get the ListView QVariant qmlmodel = list->property("model"); //access model property of ListView QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel int rows = model->rowCount(); //get number of rows from model //iterate through the model for (int i = 0; i<rows; i++) { for(int j = 0; j<model->roleNames().count(); j++) { //get the roles count qDebug() << model->index(i, 0).data(j); //get the actual data using roles } } //accessing roles for(int j = 0; j<model->roleNames().count(); j++) { qDebug() << model->roleNames()[j]; }
P.S: In your case it would be
TableView
.@p3c0
I just tried in main.cpp but I ended with the following error.ASSERT: "!isEmpty()" in file ....\Qt\Qt5.4.1\5.4\mingw491_32\include/QtCore/qlist.h, line 292
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.Main.cpp
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; SetTableDataHandling setTableDataHandling; auto root_context = engine.rootContext(); root_context->setContextProperty("SetTableDataHandling",&setTableDataHandling); //******** QObject* root = engine.rootObjects().first(); // QObject* list = root->findChild<QObject*>("setTableView"); //get the ListView // QVariant qmlmodel = list->property("model"); //access model property of ListView // QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel // int rows = model->rowCount(); //get number of rows from model // //iterate through the model // for (int i = 0; i<rows; i++) { // for(int j = 0; j<model->roleNames().count(); j++) { //get the roles count // qDebug() << model->index(i, 0).data(j); //get the actual data using roles // } // } // engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
-
@p3c0
I just tried in main.cpp but I ended with the following error.ASSERT: "!isEmpty()" in file ....\Qt\Qt5.4.1\5.4\mingw491_32\include/QtCore/qlist.h, line 292
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.Main.cpp
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; SetTableDataHandling setTableDataHandling; auto root_context = engine.rootContext(); root_context->setContextProperty("SetTableDataHandling",&setTableDataHandling); //******** QObject* root = engine.rootObjects().first(); // QObject* list = root->findChild<QObject*>("setTableView"); //get the ListView // QVariant qmlmodel = list->property("model"); //access model property of ListView // QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel // int rows = model->rowCount(); //get number of rows from model // //iterate through the model // for (int i = 0; i<rows; i++) { // for(int j = 0; j<model->roleNames().count(); j++) { //get the roles count // qDebug() << model->index(i, 0).data(j); //get the actual data using roles // } // } // engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
@vishnu
QObject* root = engine.rootObjects().first();
do this after loading the QML.But how do i get engine which is instanstiated in main.cpp to the function where I have to handle the data? Because engine is not declared in this scope right? Thanks
Pass the pointer or reference of engine to that function.
-
@vishnu
QObject* root = engine.rootObjects().first();
do this after loading the QML.But how do i get engine which is instanstiated in main.cpp to the function where I have to handle the data? Because engine is not declared in this scope right? Thanks
Pass the pointer or reference of engine to that function.
-
@vishnu
QObject* root = engine.rootObjects().first();
do this after loading the QML.But how do i get engine which is instanstiated in main.cpp to the function where I have to handle the data? Because engine is not declared in this scope right? Thanks
Pass the pointer or reference of engine to that function.
@p3c0
May I know why the roles and data are in reverse order?
What i get is:
"tracking_z"
"tracking_y"
"tracking_x"
"deceleration"
"velocity"
"z_position"
"y_position"
"x_position"
But it should be in reverse order.
what i expect the data at
qDebug() << model->index(i, 0).data(j)
is the first row and first column from left side of TableView. But It is starting from right side. How do I make it correct?Thanks -
@p3c0
May I know why the roles and data are in reverse order?
What i get is:
"tracking_z"
"tracking_y"
"tracking_x"
"deceleration"
"velocity"
"z_position"
"y_position"
"x_position"
But it should be in reverse order.
what i expect the data at
qDebug() << model->index(i, 0).data(j)
is the first row and first column from left side of TableView. But It is starting from right side. How do I make it correct?Thanks -
@vishnu
QObject* root = engine.rootObjects().first();
do this after loading the QML.But how do i get engine which is instanstiated in main.cpp to the function where I have to handle the data? Because engine is not declared in this scope right? Thanks
Pass the pointer or reference of engine to that function.
@p3c0
I am still getting the error.
ASSERT: "!isEmpty()" in file ......\Qt5.4.1\5.4\mingw491_32\include/QtCore/qlist.h, line 292
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
My main.cpp:int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; TCPCommunicationPort tcpCommunicationPort; auto root_context = engine.rootContext(); root_context->setContextProperty("tcpCommunicationPort",&tcpCommunicationPort); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); QObject* root = engine.rootObjects().first();// error at this point return app.exec(); }
The same main code was working fine in another project but When i copied the same in new project it's again saying the same error. I have loaded main.qml before
QObject* root = engine.rootObjects().first();
May i know what's the mistake? -
@p3c0
I am still getting the error.
ASSERT: "!isEmpty()" in file ......\Qt5.4.1\5.4\mingw491_32\include/QtCore/qlist.h, line 292
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
My main.cpp:int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; TCPCommunicationPort tcpCommunicationPort; auto root_context = engine.rootContext(); root_context->setContextProperty("tcpCommunicationPort",&tcpCommunicationPort); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); QObject* root = engine.rootObjects().first();// error at this point return app.exec(); }
The same main code was working fine in another project but When i copied the same in new project it's again saying the same error. I have loaded main.qml before
QObject* root = engine.rootObjects().first();
May i know what's the mistake? -
@p3c0
main.qmlimport QtQuick 2.3 import QtQuick.Window 2.2 import QtQuick.Controls 1.3 Window{ id:window width: Screen.width height: Screen.height visible: true Item{ id:mainUI anchors.fill: parent Header{ id:header } CentralView{ id:centralView anchors.top: header.bottom anchors.bottom: footer.top } //Model SetTable{ id:setTable anchors.top: header.bottom anchors.bottom: footer.top visible: false } Footer { id: footer anchors.bottom: parent.bottom } states: [ State { name: "MainView" PropertyChanges {target: centralView;cycRegVisible:false; ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:false; } }, //setTable view state State { name: "SetTableView" PropertyChanges {target: centralView;centralViewVisible:false;} PropertyChanges {target: setTable;visible:true;} PropertyChanges {target: footer;forwardButtonvisible:false;} }, State { name: "CyclicRegisterView" PropertyChanges {target: centralView;cycRegVisible:true } PropertyChanges {target: footer;backButtonvisible:true} PropertyChanges {target: centralView;ctrlReg1Visible:false } PropertyChanges {target: centralView;ctrlReg2Visible:false } PropertyChanges {target: centralView;cmodeRegVisible:false } PropertyChanges {target: centralView;directModeRegVisible:false } PropertyChanges {target: centralView;trackingModeRegVisible:false } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "ControlRegister1View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:true;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;trackingModeRegVisible:false } PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "ControlRegister2View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:true;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;trackingModeRegVisible:false } PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "OperationModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:true;directModeRegVisible:false } PropertyChanges {target: centralView;trackingModeRegVisible:false ;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "DirectModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:true} PropertyChanges {target: centralView;trackingModeRegVisible:false ;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "SetTableModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:true;trackingModeRegVisible:false;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "TrackingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:true;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "HomingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:true} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "JoggingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:true} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "SAcyclicRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:true } }, State { name: "StatusRegister1View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;statusReg1Visible:true } }, State { name: "StatusRegister2View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;statusReg2Visible:true } }, State { name: "StatusRegister3View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;statusReg3Visible:true } }, State { name: "SOperationModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sOperationRegVisible:true } }, State { name: "SDirectModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sDirectModeRegVisible:true } }, State { name: "SSetTableModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sSetTableModeRegVisible:true } }, State { name: "STrackingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sTtrackingModeRegVisible:true } }, State { name: "SHomingRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sHomingModeRegVisible:true } }, State { name: "SJoggingRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sJogginModeRegVisible:true } } ] state: "MainView" Connections{ target: centralView; onAcyclicButtonClicked:{ // console.log("switching to CyclicRegisterView") mainUI.state="CyclicRegisterView" } onControlRegister1ButtonClicked:{ // console.log("switching to Control Register1View") mainUI.state="ControlRegister1View" } onControlRegister2ButtonClicked:{ // console.log("switching to Control Register2View") mainUI.state="ControlRegister2View" } onOperationModeRegisterClicked:{ // console.log("switching to CMODE or operation mode register view") mainUI.state="OperationModeRegisterView" } onDirectModeRegisterClicked:{ // console.log("switching to direct mode register view") mainUI.state="DirectModeRegisterView" } onSetTableModeRegisterClicked:{ // console.log("switching to settable mode register view") mainUI.state="SetTableModeRegisterView" } onTrackingModeRegisterClicked:{ // console.log("switching to trakingmode register view") mainUI.state="TrackingModeRegisterView" } onHomingModeRegisterClicked:{ // console.log("switching to homing register view") mainUI.state="HomingModeRegisterView" } onJoggingModeRegisterClicked:{ // console.log("switching to joggin register view") mainUI.state="JoggingModeRegisterView" } onSAcyclicButtonClicked:{ // console.log("switching to display acyclic register view") mainUI.state="SAcyclicRegisterView" } onSStatusRegister1ButtonClicked:{ mainUI.state="StatusRegister1View" } onSStatusRegister2ButtonClicked:{ mainUI.state="StatusRegister2View" } onSStatusRegister3ButtonClicked:{ mainUI.state="StatusRegister3View" } onSOperationModeRegisterClicked:{ mainUI.state="SOperationModeRegisterView" } onSDirectModeRegisterClicked:{ mainUI.state="SDirectModeRegisterView" } onSSetTableModeRegisterClicked:{ mainUI.state="SSetTableModeRegisterView" } onSTrackingModeRegisterClicked:{ mainUI.state="STrackingModeRegisterView" } onSHomingModeRegisterClicked:{ mainUI.state="SHomingRegisterView" } onSJoggingModeRegisterClicked:{ mainUI.state="SJoggingRegisterView" } } Connections{ target: footer onBackButtoncliked:{ // console.log("switching to MainView") mainUI.state="MainView" } onForwardButtonClicked:{ mainUI.state="SetTableView" } } } }
Sorry for the lengthy one. my model is in SetTable.qml
import QtQuick 2.3 import QtQuick.Window 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 Rectangle { id:root anchors.fill: parent Row{ id:buttons anchors.top: root.top Button{ id:addNewRowButton text: "ADD" onClicked: { setTableModel.append({x_position: 0, y_position:0, z_position:0, velocity :0, acceleration:0, deceleration:0, tool:0, tracking_x:0, tracking_y:0, tracking_z:0} ) } } Button{ id:deleteRowButton text: "DELETE" onClicked: { setTableModel.remove(setTableView.currentRow) } } } ListModel{ id:setTableModel ListElement{ x_position: 1000 y_position: 200 z_position: 300 velocity: 28 acceleration:34 deceleration:14 tool:1 tracking_x: 400 tracking_y:500 tracking_z:5 } ListElement{ x_position: 1000 y_position: 200 z_position: 300 velocity: 28 acceleration:34 deceleration:14 tool:1 tracking_x: 400 tracking_y:500 tracking_z:5 } ListElement{ x_position: 100 y_position: 200 z_position: 300 velocity: 28 acceleration:34 deceleration:14 tool:1 tracking_x: 400 tracking_y:500 tracking_z:555 } } TableView{ id:setTableView objectName: "setTableView" model: setTableModel width: parent.width height: parent.height-buttons.height Layout.minimumWidth: 400 Layout.minimumHeight: 240 Layout.preferredWidth: 600 Layout.preferredHeight: 400 anchors.top: buttons.bottom TableViewColumn { role: "x_position" title: "X mm" width: 80 } TableViewColumn { role: "y_position" title: "Y mm" width: 80 } TableViewColumn { role: "z_position" title: "Z mm" width: 80 } TableViewColumn { role: "velocity" title: "V m/s" width: 80 } TableViewColumn { role: "acceleration" title: "A m/s2" width: 80 } TableViewColumn { role: "deceleration" title: "D m/s2" width: 80 } TableViewColumn { role: "tool" title: "Tool" width: 80 delegate: TextInput { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter renderType: Text.NativeRendering validator: IntValidator {bottom: 0; top: 1;} text: styleData.value } } TableViewColumn { role: "tracking_x" title: "Tx mm" width: 80 } TableViewColumn { role: "tracking_y" title: "Ty mm" width: 80 } TableViewColumn { role: "tracking_z" title: "Tz mm" width: 80 } itemDelegate: Item { TextInput { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter renderType: Text.NativeRendering text: styleData.value } } } }
But the same piece of code as main.cpp is working fine in another project. I think something is wrong with my main.qml. May i know what's the mistake? Thanks
-
@p3c0
main.qmlimport QtQuick 2.3 import QtQuick.Window 2.2 import QtQuick.Controls 1.3 Window{ id:window width: Screen.width height: Screen.height visible: true Item{ id:mainUI anchors.fill: parent Header{ id:header } CentralView{ id:centralView anchors.top: header.bottom anchors.bottom: footer.top } //Model SetTable{ id:setTable anchors.top: header.bottom anchors.bottom: footer.top visible: false } Footer { id: footer anchors.bottom: parent.bottom } states: [ State { name: "MainView" PropertyChanges {target: centralView;cycRegVisible:false; ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:false; } }, //setTable view state State { name: "SetTableView" PropertyChanges {target: centralView;centralViewVisible:false;} PropertyChanges {target: setTable;visible:true;} PropertyChanges {target: footer;forwardButtonvisible:false;} }, State { name: "CyclicRegisterView" PropertyChanges {target: centralView;cycRegVisible:true } PropertyChanges {target: footer;backButtonvisible:true} PropertyChanges {target: centralView;ctrlReg1Visible:false } PropertyChanges {target: centralView;ctrlReg2Visible:false } PropertyChanges {target: centralView;cmodeRegVisible:false } PropertyChanges {target: centralView;directModeRegVisible:false } PropertyChanges {target: centralView;trackingModeRegVisible:false } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "ControlRegister1View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:true;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;trackingModeRegVisible:false } PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "ControlRegister2View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:true;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;trackingModeRegVisible:false } PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "OperationModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:true;directModeRegVisible:false } PropertyChanges {target: centralView;trackingModeRegVisible:false ;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "DirectModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:true} PropertyChanges {target: centralView;trackingModeRegVisible:false ;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "SetTableModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:true;trackingModeRegVisible:false;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "TrackingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:true;homingModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "HomingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:true} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "JoggingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:true} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:false } }, State { name: "SAcyclicRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:true } }, State { name: "StatusRegister1View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;statusReg1Visible:true } }, State { name: "StatusRegister2View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;statusReg2Visible:true } }, State { name: "StatusRegister3View" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;statusReg3Visible:true } }, State { name: "SOperationModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sOperationRegVisible:true } }, State { name: "SDirectModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sDirectModeRegVisible:true } }, State { name: "SSetTableModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sSetTableModeRegVisible:true } }, State { name: "STrackingModeRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sTtrackingModeRegVisible:true } }, State { name: "SHomingRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sHomingModeRegVisible:true } }, State { name: "SJoggingRegisterView" PropertyChanges {target: centralView;cycRegVisible:false;ctrlReg1Visible:false;ctrlReg2Visible:false;cmodeRegVisible:false;directModeRegVisible:false} PropertyChanges {target: centralView;setTableModeRegVisible:false;trackingModeRegVisible:false;homingModeRegVisible:false;jogginModeRegVisible:false} PropertyChanges {target: footer;backButtonvisible:true; } PropertyChanges {target: centralView;displayViewVisible:true;controlViewVisible:false;sAcycRegVisible:false;sJogginModeRegVisible:true } } ] state: "MainView" Connections{ target: centralView; onAcyclicButtonClicked:{ // console.log("switching to CyclicRegisterView") mainUI.state="CyclicRegisterView" } onControlRegister1ButtonClicked:{ // console.log("switching to Control Register1View") mainUI.state="ControlRegister1View" } onControlRegister2ButtonClicked:{ // console.log("switching to Control Register2View") mainUI.state="ControlRegister2View" } onOperationModeRegisterClicked:{ // console.log("switching to CMODE or operation mode register view") mainUI.state="OperationModeRegisterView" } onDirectModeRegisterClicked:{ // console.log("switching to direct mode register view") mainUI.state="DirectModeRegisterView" } onSetTableModeRegisterClicked:{ // console.log("switching to settable mode register view") mainUI.state="SetTableModeRegisterView" } onTrackingModeRegisterClicked:{ // console.log("switching to trakingmode register view") mainUI.state="TrackingModeRegisterView" } onHomingModeRegisterClicked:{ // console.log("switching to homing register view") mainUI.state="HomingModeRegisterView" } onJoggingModeRegisterClicked:{ // console.log("switching to joggin register view") mainUI.state="JoggingModeRegisterView" } onSAcyclicButtonClicked:{ // console.log("switching to display acyclic register view") mainUI.state="SAcyclicRegisterView" } onSStatusRegister1ButtonClicked:{ mainUI.state="StatusRegister1View" } onSStatusRegister2ButtonClicked:{ mainUI.state="StatusRegister2View" } onSStatusRegister3ButtonClicked:{ mainUI.state="StatusRegister3View" } onSOperationModeRegisterClicked:{ mainUI.state="SOperationModeRegisterView" } onSDirectModeRegisterClicked:{ mainUI.state="SDirectModeRegisterView" } onSSetTableModeRegisterClicked:{ mainUI.state="SSetTableModeRegisterView" } onSTrackingModeRegisterClicked:{ mainUI.state="STrackingModeRegisterView" } onSHomingModeRegisterClicked:{ mainUI.state="SHomingRegisterView" } onSJoggingModeRegisterClicked:{ mainUI.state="SJoggingRegisterView" } } Connections{ target: footer onBackButtoncliked:{ // console.log("switching to MainView") mainUI.state="MainView" } onForwardButtonClicked:{ mainUI.state="SetTableView" } } } }
Sorry for the lengthy one. my model is in SetTable.qml
import QtQuick 2.3 import QtQuick.Window 2.2 import QtQuick.Controls 1.3 import QtQuick.Layouts 1.1 Rectangle { id:root anchors.fill: parent Row{ id:buttons anchors.top: root.top Button{ id:addNewRowButton text: "ADD" onClicked: { setTableModel.append({x_position: 0, y_position:0, z_position:0, velocity :0, acceleration:0, deceleration:0, tool:0, tracking_x:0, tracking_y:0, tracking_z:0} ) } } Button{ id:deleteRowButton text: "DELETE" onClicked: { setTableModel.remove(setTableView.currentRow) } } } ListModel{ id:setTableModel ListElement{ x_position: 1000 y_position: 200 z_position: 300 velocity: 28 acceleration:34 deceleration:14 tool:1 tracking_x: 400 tracking_y:500 tracking_z:5 } ListElement{ x_position: 1000 y_position: 200 z_position: 300 velocity: 28 acceleration:34 deceleration:14 tool:1 tracking_x: 400 tracking_y:500 tracking_z:5 } ListElement{ x_position: 100 y_position: 200 z_position: 300 velocity: 28 acceleration:34 deceleration:14 tool:1 tracking_x: 400 tracking_y:500 tracking_z:555 } } TableView{ id:setTableView objectName: "setTableView" model: setTableModel width: parent.width height: parent.height-buttons.height Layout.minimumWidth: 400 Layout.minimumHeight: 240 Layout.preferredWidth: 600 Layout.preferredHeight: 400 anchors.top: buttons.bottom TableViewColumn { role: "x_position" title: "X mm" width: 80 } TableViewColumn { role: "y_position" title: "Y mm" width: 80 } TableViewColumn { role: "z_position" title: "Z mm" width: 80 } TableViewColumn { role: "velocity" title: "V m/s" width: 80 } TableViewColumn { role: "acceleration" title: "A m/s2" width: 80 } TableViewColumn { role: "deceleration" title: "D m/s2" width: 80 } TableViewColumn { role: "tool" title: "Tool" width: 80 delegate: TextInput { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter renderType: Text.NativeRendering validator: IntValidator {bottom: 0; top: 1;} text: styleData.value } } TableViewColumn { role: "tracking_x" title: "Tx mm" width: 80 } TableViewColumn { role: "tracking_y" title: "Ty mm" width: 80 } TableViewColumn { role: "tracking_z" title: "Tz mm" width: 80 } itemDelegate: Item { TextInput { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter renderType: Text.NativeRendering text: styleData.value } } } }
But the same piece of code as main.cpp is working fine in another project. I think something is wrong with my main.qml. May i know what's the mistake? Thanks
@vishnu No idea. Seems closer to this QTBUG-44859.
Can you try trimming down themain.qml
i.e removing some component and then executing ? -
@vishnu No idea. Seems closer to this QTBUG-44859.
Can you try trimming down themain.qml
i.e removing some component and then executing ? -
@p3c0
Got it.The error was due to the wrong import statement in qml.
Now How do I capture the changes?
If reading the entire model is the solution (ofcourse not efficient).
How can I call this public slot getModel when ever there is a change in TableView in qml? What is the signal I get from the model/view which tells me that there is a change ?void TCPCommunicationPort::getModel(QQmlApplicationEngine &engine) { QObject* root = engine.rootObjects().first(); //get the root object as usual QObject* list = root->findChild<QObject*>("setTableView"); //get the ListView QVariant qmlmodel = list->property("model"); //access model property of ListView QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel .....//data is handled here
-
@p3c0
Got it.The error was due to the wrong import statement in qml.
Now How do I capture the changes?
If reading the entire model is the solution (ofcourse not efficient).
How can I call this public slot getModel when ever there is a change in TableView in qml? What is the signal I get from the model/view which tells me that there is a change ?void TCPCommunicationPort::getModel(QQmlApplicationEngine &engine) { QObject* root = engine.rootObjects().first(); //get the root object as usual QObject* list = root->findChild<QObject*>("setTableView"); //get the ListView QVariant qmlmodel = list->property("model"); //access model property of ListView QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); //convert to QAbstractListModel .....//data is handled here
@vishnu As we casted it to
QAbstractListModel
we can connect to its signal dataChanged from C++. Thus when anything changes the slot will be called.QAbstractListModel *model = qvariant_cast<QAbstractListModel *>(qmlmodel); QObject::connect(model,SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)), &myclass,SLOT(onDataChanged(QModelIndex,QModelIndex,QVector<int>)));
Access the changed data in slot
void MyClass::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) { qDebug() << "Data Changed :" << topLeft.data(roles[0]) << topLeft.data(roles[1]); }