Auswahl bzw. Anzeige von Inhalten des TableView in QML



  • Hallo,

    ich bin mal wieder auf eine Frage gestoßen bei der ich momentan fest stecke.

    Ich habe eine Tabelle die ich in einem TableView anzeige. Diese wird per Funktion von einem JSON gefüllt.

    Die Tabelle selbst ist nichts besonderes und ich habe auch schon mitbekommen das ich per Event "onClicked" des TableView auf die geclickte Zeile reagieren kann.

    Aktuell versuche ich die eingetragenen Werte in der Tabelle per "onClick" anzuzeigen.

    Genauer gesagt würde ich gerne später beim Clicken auf eine Zeile den Wert der unter der TableViewColumn mit Role 'ipaddress' angegeben ist anzeigen (da ich diesen als Schlüssel für eine QMap nutze).

    Ich habe herausgefunden das ich mir den Index der angeklickten Zeile per "row" ausgeben kann, mehr Möglichkeiten auf den Zugriff habe ich bisher noch nicht gefunden.

    Hat vielleicht jemand einen Tip für mich wie man Werte aus der Tabelle raus bekommt.

    Hier nochmal die (extrem einfache) Tabelle:

    TableView {
            id: view
            anchors.top: controls.bottom
            height: root.height - controls.height
            width: root.width
    
            TableViewColumn {
                role: 'name'
                title: "Servername"
                width: view.width * 0.5
            }
    
            TableViewColumn {
                role: 'ipaddress'
                title: "IP Adresse"
                width: view.width * 0.3
            }
    
            TableViewColumn {
                role: 'port'
                title: "Port"
                width: view.width * 0.19
            }
            onClicked: {
                console.log(row)
            }
    
        }
    

    Mit freundlichen Grüßen

    Marco


  • Moderators

    hihi,

    meine Erfahrung mit dem TableView in QML sind begrenzt, aber vom Prinzip her sollte es sich wie beim LiestView verhalten.

    d.h du solltest mit modelData btwmodel.get(index) zugriff auf das item bekommen.

    Mehr Informationen hier:
    http://doc.qt.io/qt-5/qml-qtqml-models-listmodel.html#get-method



  • Hallo @J.Hilk,

    danke für die Antwort.

    Mein Problem ist das ich kein ListModel definiert habe. Es gibt nur den TableView den ich gepostet habe der bei Änderungen (z.B. neue Daten kommen an) per Funktion ein Model aus einem QString mit einem JSON Inhalt bekommt).

    function fillJsonModel()
        {
            view.model = JSON.parse(clientView.text)
        }
    

    Ich hatte gehofft das ich irgendwie an die Daten in dem Tableview ran komme. Per Anclicken habe ich ja schon eine Reihe die ich per "row" ziehen kann. Was mich zu der Überlegung bringt ob ich nicht, wenn ich schon nicht an die Tabelle oder die Zellen ran komme nicht auf irgend einem Wege aus der JSON den Datensatz Nummer "row+1" ziehen könnte weil die Tabelle ja aus der JSON gebaut wird und ich darin ja alles hätte.

    Oder bin ich an der Stelle auf dem kompletten Holzweg?

    Gruß

    Marco


  • Moderators

    @Throndar

    versteh das Problem nicht ganz, damit gibst du dem TableView ja ein model, und dann solltest du mit model.get() drauf zugreifen können?

    Hier einstackoverflow thread mit Beispiel, hoffe das hilft dir weiter

    https://stackoverflow.com/questions/32956108/qml-tableview-get-data-from-specific-cell-selected-row-specific-column



  • Hallo @J.Hilk,

    ich versuche es gerade nachzuvollziehen.

    Meine Tabelle baue ich ja so (der Übersichtlichkeit nur eine Spalte)

    TableView {
            id: view
            anchors.top: controls.bottom
            height: root.height - controls.height
            width: root.width
    
            TableViewColumn {
                role: 'name'
                title: "Servername"
                width: view.width * 0.5
            }
    
    onClicked: {
                console.log(row)
                console.log(view.model)
                console.log(view.model.get(row).name)
    
            }
    }
    

    Ich hatte jetzt versucht über das model vom view (view.model) per get der Zeile (row) auf das Element "name" zuzugreifen.

    Worauf ich als Meldung bekomme:

    qrc:/Clients.qml:117: TypeError: Property 'get' of object [object Object],[object Object] is not a function
    

    Ich bin jetzt am Überlegen was für eine Art model QT beim einlesen per JSON.parse(String) überhaupt anlegt wenn man das als model setzt.

    Der Fehlermeldung nach würde ich meinen das es ja ein ObjectModel ist, was mich aber vor das Problem stellt wie ich drauf zugreifen soll wenn es ja erst beim einlesen der Werte zur Laufzeit erstellt wird.

    Ich habe das Beispiel von dir bei Stackoverflow angeschaut, dort sind die Werte fest in dem ListModel. Ich denke deswegen funktioniert es dort direkt.

    Aktuell bin ich ein wenig Ratlos da die Doku zu ObjectModels Modelle mit Rectangles gefüllt werden auf die aber nicht wieder zugegriffen wird.

    Trotzdem nochmal vielen Dank für die Hilfe,

    Gruß

    Marco



  • Ich habs :)

    dein Denkanstoß war genau was ich gebraucht habe. Mein Problem war das ich das falsche Model genutzt habe und es wirklich ein Datenmodel ist nach dem Parse ist.

    Ich habe jetzt zwei Dinge getan:

    1. ein ListModel definiert was ich füllen kann
    ListModel {
        id: viewModel
    }
    
    1. die Funktion zum das Model zu füllen angepasst um das neu erstelle ListModel mit dem Daten als ListModel zu füllen
    function fillJsonModel()
        {
            var data = JSON.parse(clientView.text)
            for (var i in data) {
                viewModel.append({ipaddress: data[i]["ipaddress"], name: data[i]["name"],port: data[i]["port"]});
            }
    }
    

    Anschließend komme ich direkt an meine Felder ran per:

                console.log("Name: " + view.model.get(row).name)
                console.log("Adresse: " + view.model.get(row).ipaddress)
                console.log("Port: " + view.model.get(row).port)
    

    Vielen Dank!


Log in to reply
 

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