Qml cannot access tableview cell



  • Hi everyone,

    I made a little app which contains cpp code that makes a data model and shares it with Qml using a QProperty . The model works well and i can see all of those data in my Qml tableview.
    But i cannot access to cell contents of that tableview. When i try to do that, I face with this error: "TypeError: Cannot read property 'two' of undefined". (the role "two" exists in model)
    This is my Qml Code:
    console.log(parseInt(myModel_2_1.data(table.currentRow).two));
    I also Tried this code:
    console.log(parseInt(myModel_2_1.data(0).two));
    and i also tried to remove parseInt() and a lot of other things but i didn't made it to access tableview cells content.

    I hope one of you guys help me in this. Thank you all and sorry for my bad English.


  • Moderators

    Hi @iMasoud
    I'm assuming the data method you are referring to is the re-implemented inbuilt method as described here. If so, then you are missing one of the parameter. The correct call should be something like:

    tableModel.data(tableModel.index(0,0), 257); 
    //1st argument = create QModelIndex with row=0 and column=0
    //2nd argument = integer equivalent of rolename as required by the method
    

    Now the problem with this is its not very user friendly to pass an integer as a role. So instead you can write a Q_INVOKABLE method in your model which can return the integer equivalent of your role name. Something like:

    int TableModel::getRoleKey(QString rolename)
    {
        return roleNames().key(rolename.toLatin1());
    }
    

    now substitute this with the data method call in QML

    tableModel.data(tableModel.index(0,0), tableModel.getRoleKey("name")); 
    //add your rolename instead of "name".
    

    Hope this helps...



  • Hi @p3c0 ,

    thankyou very much for your reply! I use the arguments that you mentioned but still it didn't work. so i tried this:

    console.log(myModel_2_1.data(myModel_2_1.index(0,0), 2));
    //myModel_2_1 is a QProperty that contains data model provided by c++

    and here is what console printed:
    qml: undefined

    also

    console.log(typeof(myModel_2_1.data(myModel_2_1.index(0,0), 2)));

    that returned "qml: undefined" again!

    i really don't know about data model keys that's been used in myModel_2_1 since the c++ is written by my colleague but this is the c++ function that provides the data model:

    ...
    ...
    ...
    while ( q.next() )
    {
    // QVariant j = QVariant::fromValue(q.at()+1);
    QStandardItem* it = new QStandardItem();
    it->setData(q.at()+1, MyModel::role1); //row number
    it->setData(q.value(0), MyModel::role2); //id
    it->setData(q.value(1), MyModel::role3); //name
    it->setData(q.value(2), MyModel::role4); //parentId
    it->setData(q.value(3), MyModel::role5); //saving
    it->setData(q.value(4), MyModel::role6); //Calendar//////////////////
    it->setData(q.value(5), MyModel::role7); //amount
    it->setData(q.value(6), MyModel::role8); //remaining
    it->setData(q.value(7), MyModel::role9); //Installments
    QString s;
    if(q.value(8).toString() != NULL)
    {
    s=dateShamsi.ToShamsi(QVariant::fromValue(q.value(8).toDate().year()).toString(),
    QVariant::fromValue(q.value(8).toDate().month()).toString(),
    QVariant::fromValue(q.value(8).toDate().day()).toString());
    }
    else { s = ""; }
    it->setData(s, MyModel::role10); //start
    it->setData(q.value(9), MyModel::role11); //Installments_counter
    it->setData(q.value(10), MyModel::role12); //Installments_pass
    my_model->appendRow(it);
    }
    ...
    ...
    ....

    I hope it help you to find out what's wrong. I am really confused with this and there is a deadline that i should make.

    thankyou again and sorry for my bad English


  • Moderators

    @iMasoud Check the role. Use the method that I posted earlier viz. getRoleKey.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.