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
-
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
-
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
-
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:
- ein ListModel definiert was ich füllen kann
ListModel { id: viewModel }
- 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!