shadowolf
23rd July 2015, 19:14
Hi,
This is my first time using PyQt. I am attempting to parse an XML file and display the hierarchy in a QTreeview and allow the user to edit the properties of a particular element in a QTableView. I have successfully parsed the XML using etree and populated a QStandardItemModel. I've been trying to figure out the QItemViewDelegate but have not had much success yet.
My issue is this: When I select an item in the QTreeView how can I update the QTableView to only display the properties of the selected element?
My other issue is I still need to figure out how to populate the attributes in the QStandardItemModel (I assume I need to add to qt.UserRole with setData, but I have not gotten that far in yet).
As an example: I want to select Tab1 in the QTreeView and in the QTableView I want to see only
Field | Value
-------------
Name | tab1
img | xyz.jpg
uid | 123
Below is my python code
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *
import xml.etree.ElementTree as ET
class Window(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
# -- Load QT .ui file --
self.ui = loadUi('test.ui')
# ----
# -- Display UI using QT ui layout --
self.ui.show()
# ----
# -- Initialize data models for Treeview and Tableview
self.modelTreeView = QStandardItemModel()
self.modelTableView = QStandardItemModel()
self.ui.XMLTreeView.setModel(self.modelTreeView)
self.ui.ItemProperties.setModel(self.modelTreeView )
# ----
#UI Tree view item selection
self.connect(self.ui.XMLTreeView.selectionModel(), SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), fnXMLUpdate)
tree = ET.parse('test.xml')
root = tree.getroot()
temp = tree.findall(".//tab[@uid='123']")
parseXML(self.modelTreeView, root)
# ----
#UI Decorations
self.modelTreeView.setHorizontalHeaderLabels([self.tr("Object")])
self.modelTableView.setHorizontalHeaderLabels(["Property","Value"])
# ----
def fnXMLUpdate(current,previous):
print("new item selected in tree view")
index = window.ui.XMLTreeView.selectedIndexes()[0]
print(index)
crawler = index.model().itemFromIndex(index)
print "Node Name: %s" % crawler.data(Qt.DisplayRole).toString()
uid=crawler.data(Qt.UserRole).toString()
print "Node uid: %s" % uid
print("end new tree view")
item = QStandardItem()
item.setData(crawler.data(Qt.UserRole), Qt.DisplayRole)
item.setData(crawler.data(Qt.UserRole), Qt.UserRole)
window.ui.ItemProperties.setRootIndex(index)
#window.modelTableView.setRootIndex(index)
#window.modelTableView.appendRow(item)
#window.modelTableView.setHorizontalHeaderLabels(["Property","Value"])
def parseXML(parent, node):
for element in node:
item = QStandardItem()
item.setData(element.attrib.get('name'), Qt.DisplayRole)
item.setData(element.attrib.get('uid'), Qt.UserRole)
parseXML(item, element)
parent.appendRow(item)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
Attached is the XML and UI file
This is my first time using PyQt. I am attempting to parse an XML file and display the hierarchy in a QTreeview and allow the user to edit the properties of a particular element in a QTableView. I have successfully parsed the XML using etree and populated a QStandardItemModel. I've been trying to figure out the QItemViewDelegate but have not had much success yet.
My issue is this: When I select an item in the QTreeView how can I update the QTableView to only display the properties of the selected element?
My other issue is I still need to figure out how to populate the attributes in the QStandardItemModel (I assume I need to add to qt.UserRole with setData, but I have not gotten that far in yet).
As an example: I want to select Tab1 in the QTreeView and in the QTableView I want to see only
Field | Value
-------------
Name | tab1
img | xyz.jpg
uid | 123
Below is my python code
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *
import xml.etree.ElementTree as ET
class Window(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
# -- Load QT .ui file --
self.ui = loadUi('test.ui')
# ----
# -- Display UI using QT ui layout --
self.ui.show()
# ----
# -- Initialize data models for Treeview and Tableview
self.modelTreeView = QStandardItemModel()
self.modelTableView = QStandardItemModel()
self.ui.XMLTreeView.setModel(self.modelTreeView)
self.ui.ItemProperties.setModel(self.modelTreeView )
# ----
#UI Tree view item selection
self.connect(self.ui.XMLTreeView.selectionModel(), SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), fnXMLUpdate)
tree = ET.parse('test.xml')
root = tree.getroot()
temp = tree.findall(".//tab[@uid='123']")
parseXML(self.modelTreeView, root)
# ----
#UI Decorations
self.modelTreeView.setHorizontalHeaderLabels([self.tr("Object")])
self.modelTableView.setHorizontalHeaderLabels(["Property","Value"])
# ----
def fnXMLUpdate(current,previous):
print("new item selected in tree view")
index = window.ui.XMLTreeView.selectedIndexes()[0]
print(index)
crawler = index.model().itemFromIndex(index)
print "Node Name: %s" % crawler.data(Qt.DisplayRole).toString()
uid=crawler.data(Qt.UserRole).toString()
print "Node uid: %s" % uid
print("end new tree view")
item = QStandardItem()
item.setData(crawler.data(Qt.UserRole), Qt.DisplayRole)
item.setData(crawler.data(Qt.UserRole), Qt.UserRole)
window.ui.ItemProperties.setRootIndex(index)
#window.modelTableView.setRootIndex(index)
#window.modelTableView.appendRow(item)
#window.modelTableView.setHorizontalHeaderLabels(["Property","Value"])
def parseXML(parent, node):
for element in node:
item = QStandardItem()
item.setData(element.attrib.get('name'), Qt.DisplayRole)
item.setData(element.attrib.get('uid'), Qt.UserRole)
parseXML(item, element)
parent.appendRow(item)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
Attached is the XML and UI file