Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Compare Items of listview and aray
Forum Updated to NodeBB v4.3 + New Features

Compare Items of listview and aray

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
14 Posts 4 Posters 2.3k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Psyduck0205

    I have to use python.
    I tried work around the object model like InteruderExcluder suggested

    listview = squish.waitForObject(ecusListView)
    model = listview.model
    

    But with that, model is "null"
    I tried to iterate over the Elements but like IntruderExcluder said, i cant past the non visible delegates. So im basicly at 0 again.
    Any help of how i have to work around the model?

    (Squish is basicly an IDE for GUI Testing. Thats what its all About. I Need to make sure that the model or delegates are correct in correlation to the entries in the database.)

    ODБOïO Offline
    ODБOïO Offline
    ODБOï
    wrote on last edited by
    #5

    @Psyduck0205
    a qml js version in case it can help

    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        property var myArr : [33,66.6,1.94]
    
        ListModel {
            id: fruitModel
    
            ListElement {
                name: "Apple"
                cost: 800
            }
            ListElement {
                name: "Orange"
                cost: 66.6
            }
            ListElement {
                name: "Banana"
                cost: 1.95
            }
        }
    
        ListView{
            id:l
            model: fruitModel
            anchors.fill: parent
            delegate: Text {
                height: 30
                width: parent.width
                text: name+  " : "+ cost
            }
        }
    
        Component.onCompleted: compare()
    
        function compare(){
            for(var e=0; e < l.model.count; e++){
                console.log( (l.model.get(e).cost === myArr[e]) )
            }
        }
    }
    
    1 Reply Last reply
    0
    • P Offline
      P Offline
      Psyduck0205
      wrote on last edited by Psyduck0205
      #6
      		ListView {
      			id: filteredElements
      
      			anchors.fill: parent
      
      			header: Item {}
      			delegate: ListViewDelegate {
      				onClicked: root.filteredClickHandler
      			}
      
      			model: root.controller.filteredModel
      
      			listView.section.property: "shortName"
      			listView.section.criteria: ViewSection.FirstCharacter
      			listView.section.labelPositioning: ViewSection.CurrentLabelAtStart | ViewSection.InlineLabels
      			listView.section.delegate: Component {
      				id: sectionHeading
      				Rectangle {
      					width: parent.width
      					height: childrenRect.height
      					color: Style.rbsDarkGray
      
      					Text {
      						leftPadding: Style.listView.delegate.textPadding
      						text: section
      						font.bold: true
      						font.pixelSize: 10
      						color: Style.rbsLightBlue
      					}
      				}
      			}
      

      I digged trough our bitbucket and managed to finde the Definition of the listview. So that is basicly what i have to work with.
      I dont realy understand how to Transfer the Code of LeLev to python.

      console.log( (l.model.get(e).cost === myArr[e]) )

      Does every l.model has a get() function?

      Without compiling it i tried something:

      listview = squish.waitForObject(ecusListView) #That Returns the objects QQuickListview
      model = listview.model
      maxcount = listview.count
      myarray = []
      for i in range(maxcount):
          myarray.append(listview.model.get(i).text) 
      

      Does that makes sense? Is that the Right way?

      1 Reply Last reply
      0
      • IntruderExcluderI Offline
        IntruderExcluderI Offline
        IntruderExcluder
        wrote on last edited by
        #7

        If it is QML ListModel then yes, it has get method. For C++ models derived from QAbstractItemModel there is data method to retrieve data by role. Also rowCount and index are exposed to QML too.

        P 1 Reply Last reply
        0
        • IntruderExcluderI IntruderExcluder

          If it is QML ListModel then yes, it has get method. For C++ models derived from QAbstractItemModel there is data method to retrieve data by role. Also rowCount and index are exposed to QML too.

          P Offline
          P Offline
          Psyduck0205
          wrote on last edited by
          #8

          @IntruderExcluder
          Yes it is QML.

          when i try to run it i get the following error:

          Detail AttributeError: 'QVariant' Squish object has no attribute 'get' C:\Users\tsc\repos\rbsplus_guitests\suite_RBS_Plus_Test_Suite\shared\steps\steps.py:333

          Line 333:
          myarray.append(listview.model.get(i).text)

          1 Reply Last reply
          0
          • IntruderExcluderI Offline
            IntruderExcluderI Offline
            IntruderExcluder
            wrote on last edited by IntruderExcluder
            #9

            I'm not familiar with python, but can give you an example in C++. Lets say you have some ListView with ListModel declared in main QML file:

                ListView {
                    objectName: "view1"
                    model: ListModel {
                        ListElement { prop1: "asd"; prop2: 42 }
                    }
                }
            

            Here is an example how to get values for Qt 5.12.3 (it is a bit easier for greater versions):

                /* Get list view */
                auto view = engine.rootObjects()[0]->findChild<QObject*>("view1");
                /* Get model property */
                QQmlListModel* model = view->property("model").value<QQmlListModel*>();
                /* Some magic */
                auto handle = model->get(0);
                auto eengine = qmlEngine(model)->handle();
                QJSValue jsvalue(eengine, handle);
                /* Get values of ListElement item */
                QString prop1 = jsvalue.property("prop1").toString(); // "asd"
                int prop2 = jsvalue.property("prop2").toInt(); // 42
            

            You also need to use qml-private modules, since QQmlListModel is private class.

            1 Reply Last reply
            0
            • P Offline
              P Offline
              Psyduck0205
              wrote on last edited by Psyduck0205
              #10

              Thank Intruder,

              i understand how that works :)

              The only Problem: I wondered why i couldnt use the get() function. And after a bit of searching i managed to Change the Code to that:

              listview = squish.waitForObject(ecusListView)
              model = object.convertTo(listview.model,"QObject")
              maxcount = listview.count
              myarray = []
              for i in range(maxcount):
                  myarray.append(model.get(i).text)    
              

              listview.model Returns a QVariant, which is basicly a container where you put everything in, and let python handle it.
              I then casted the QVariant to QObject to see which class is behind the QVariant.
              Turns out its not QmlLIstModel, its

              https://doc.qt.io/qt-5/qidentityproxymodel.html#details

              And now i have no clue to handle that class and do what i want

              1 Reply Last reply
              0
              • IntruderExcluderI Offline
                IntruderExcluderI Offline
                IntruderExcluder
                wrote on last edited by
                #11

                So, it is C++ model, not QML. Then you can use data method to retrieve data. Something like this:

                for i in range(maxcount):
                    myarray.append(model.data(model.index(i, 0), %your_role_here%))
                
                1 Reply Last reply
                1
                • P Offline
                  P Offline
                  Psyduck0205
                  wrote on last edited by Psyduck0205
                  #12

                  Hey Intruder thank you for your Reply.

                  That brought me close the solution i think.

                  The Problem that i have now is: How to deal with the QVariants that are now written in the Array.
                  I think i have to cast them first to extract the exact value i want.

                  Do you know what i have to do?

                  S 1 Reply Last reply
                  0
                  • IntruderExcluderI Offline
                    IntruderExcluderI Offline
                    IntruderExcluder
                    wrote on last edited by
                    #13

                    Depends on what you want. If you have list of QVariant then you can compare them, at least in C++ this works. To compare with exact values you should of course get values from QVariant. For example cast them to integers with toInt() method.

                    1 Reply Last reply
                    3
                    • P Psyduck0205

                      Hey Intruder thank you for your Reply.

                      That brought me close the solution i think.

                      The Problem that i have now is: How to deal with the QVariants that are now written in the Array.
                      I think i have to cast them first to extract the exact value i want.

                      Do you know what i have to do?

                      S Offline
                      S Offline
                      Sahana
                      wrote on last edited by
                      #14

                      @Psyduck0205

                      I too facing similar issue. I need to access list of qvariant from squish?
                      Can you help me ?

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved