PyQt - XML to QTreeWidget

前端 未结 2 1965
無奈伤痛
無奈伤痛 2020-12-10 10:17

I\'m trying to make a basic XML story maker in PyQt. So far I\'ve been able to figure out everything my self, but I\'ve run into a bit of a snag. I can\'t figure out how to

相关标签:
2条回答
  • 2020-12-10 10:26

    You'll need to write something yourself to pull in the information from the XML file (hint: use a python XML parser like ElementTree). This code will build a tree widget with the rows (and subrows) filled out from data.

    class Tree(QtGui.QTreeWidget):
    
        def __init__(self, parent):
            # maybe init your data here too
            super(Tree, self).__init__(parent)
    
        def populate(self, data):
            # populate the tree with QTreeWidgetItem items
            for row in data:
                # is attached to the root (parent) widget
                rowItem = QtGui.QTreeWidgetItem(parent)
                rowItem.setText(0, row)
                for subRow in row:
                     # is attached to the current row (rowItem) widget
                     subRowItem = QtGui.QTreeWidgetItem(rowItem)
                     subRowItem.setText(0, subRow)
    
    0 讨论(0)
  • 2020-12-10 10:46

    It looks like you you could use QXmlDefaultHandler to do this.

    Here's a simple demo script that shows how to use it:

    from PyQt4 import QtCore, QtGui, QtXml
    
    class XmlHandler(QtXml.QXmlDefaultHandler):
        def __init__(self, root):
            QtXml.QXmlDefaultHandler.__init__(self)
            self._root = root
            self._item = None
            self._text = ''
            self._error = ''
    
        def startElement(self, namespace, name, qname, attributes):
            if qname == 'folder' or qname == 'item':
                if self._item is not None:
                    self._item = QtGui.QTreeWidgetItem(self._item)
                else:
                    self._item = QtGui.QTreeWidgetItem(self._root)
                self._item.setData(0, QtCore.Qt.UserRole, qname)
                self._item.setText(0, 'Unknown Title')
                if qname == 'folder':
                    self._item.setExpanded(True)
                elif qname == 'item':
                    self._item.setText(1, attributes.value('type'))
            self._text = ''
            return True
    
        def endElement(self, namespace, name, qname):
            if qname == 'title':
                if self._item is not None:
                    self._item.setText(0, self._text)
            elif qname == 'folder' or qname == 'item':
                self._item = self._item.parent()
            return True
    
        def characters(self, text):
            self._text += text
            return True
    
        def fatalError(self, exception):
            print('Parse Error: line %d, column %d:\n  %s' % (
                  exception.lineNumber(),
                  exception.columnNumber(),
                  exception.message(),
                  ))
            return False
    
        def errorString(self):
            return self._error
    
    class Window(QtGui.QTreeWidget):
        def __init__(self):
            QtGui.QTreeWidget.__init__(self)
            self.header().setResizeMode(QtGui.QHeaderView.Stretch)
            self.setHeaderLabels(['Title', 'Type'])
            source = QtXml.QXmlInputSource()
            source.setData(xml)
            handler = XmlHandler(self)
            reader = QtXml.QXmlSimpleReader()
            reader.setContentHandler(handler)
            reader.setErrorHandler(handler)
            reader.parse(source)
    
    xml = """\
    <root>
        <folder>
            <title>Folder One</title>
            <item type="1">
                <title>Item One</title>
            </item>
            <item type="1">
                <title>Item Two</title>
            </item>
            <item type="2">
                <title>Item Three</title>
            </item>
            <folder>
                <title>Folder Two</title>
                <item type="3">
                    <title>Item Four</title>
                </item>
                <item type="0">
                    <title>Item Five</title>
                </item>
                <item type="1">
                    <title>Item Six</title>
                </item>
            </folder>
        </folder>
        <folder>
            <title>Folder Three</title>
            <item type="0">
                <title>Item Six</title>
            </item>
            <item type="2">
                <title>Item Seven</title>
            </item>
            <item type="2">
                <title>Item Eight</title>
            </item>
        </folder>
    </root>
    """
    
    if __name__ == '__main__':
    
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.resize(400, 300)
        window.show()
        sys.exit(app.exec_())
    
    0 讨论(0)
提交回复
热议问题