When you have a hierarchical data model and you want to present the data visually, Tree view widget is probably the best choice.

In this PyQt5 tutorial, we are going to graph a hierarchical data set using the QTreeView widget.


Buy Me a Coffee? Your support is much appreciated!
PayPal Me: https://www.paypal.me/jiejenn/5
Venmo: @Jie-Jenn





Source Code:

<span class="hljs-keyword">import</span> sys
<span class="hljs-keyword">from</span> PyQt5.QtWidgets <span class="hljs-keyword">import</span> QApplication, QMainWindow, QTreeView
<span class="hljs-keyword">from</span> PyQt5.Qt <span class="hljs-keyword">import</span> QStandardItemModel, QStandardItem
<span class="hljs-keyword">from</span> PyQt5.QtGui <span class="hljs-keyword">import</span> QFont, QColor


<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StandardItem</span><span class="hljs-params">(QStandardItem)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, txt=<span class="hljs-string">''</span>, font_size=<span class="hljs-number">12</span>, set_bold=False, color=QColor<span class="hljs-params">(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>)</span>)</span>:</span>
        super().__init__()

        fnt = QFont(<span class="hljs-string">'Open Sans'</span>, font_size)
        fnt.setBold(set_bold)

        self.setEditable(<span class="hljs-literal">False</span>)
        self.setForeground(color)
        self.setFont(fnt)
        self.setText(txt)


<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AppDemo</span><span class="hljs-params">(QMainWindow)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span>
        super().__init__()
        self.setWindowTitle(<span class="hljs-string">'World Country Diagram'</span>)
        self.resize(<span class="hljs-number">500</span>, <span class="hljs-number">700</span>)

        treeView = QTreeView()
        treeView.setHeaderHidden(<span class="hljs-literal">True</span>)

        treeModel = QStandardItemModel()
        rootNode = treeModel.invisibleRootItem()


        <span class="hljs-comment"># America</span>
        america = StandardItem(<span class="hljs-string">'America'</span>, <span class="hljs-number">16</span>, set_bold=<span class="hljs-literal">True</span>)

        california = StandardItem(<span class="hljs-string">'California'</span>, <span class="hljs-number">14</span>)
        america.appendRow(california)

        oakland = StandardItem(<span class="hljs-string">'Oakland'</span>, <span class="hljs-number">12</span>, color=QColor(<span class="hljs-number">155</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))
        sanfrancisco = StandardItem(<span class="hljs-string">'San Francisco'</span>, <span class="hljs-number">12</span>, color=QColor(<span class="hljs-number">155</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))
        sanjose = StandardItem(<span class="hljs-string">'San Jose'</span>, <span class="hljs-number">12</span>, color=QColor(<span class="hljs-number">155</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))

        california.appendRow(oakland)
        california.appendRow(sanfrancisco)
        california.appendRow(sanjose)


        texas = StandardItem(<span class="hljs-string">'Texas'</span>, <span class="hljs-number">14</span>)
        america.appendRow(texas)

        austin = StandardItem(<span class="hljs-string">'Austin'</span>, <span class="hljs-number">12</span>, color=QColor(<span class="hljs-number">155</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))
        houston = StandardItem(<span class="hljs-string">'Houston'</span>, <span class="hljs-number">12</span>, color=QColor(<span class="hljs-number">155</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))
        dallas = StandardItem(<span class="hljs-string">'dallas'</span>, <span class="hljs-number">12</span>, color=QColor(<span class="hljs-number">155</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))

        texas.appendRow(austin)
        texas.appendRow(houston)
        texas.appendRow(dallas)


        <span class="hljs-comment"># Canada </span>
        canada = StandardItem(<span class="hljs-string">'America'</span>, <span class="hljs-number">16</span>, set_bold=<span class="hljs-literal">True</span>)

        alberta = StandardItem(<span class="hljs-string">'Alberta'</span>, <span class="hljs-number">14</span>)
        bc = StandardItem(<span class="hljs-string">'British Columbia'</span>, <span class="hljs-number">14</span>)
        ontario = StandardItem(<span class="hljs-string">'Ontario'</span>, <span class="hljs-number">14</span>)
        canada.appendRows([alberta, bc, ontario])


        rootNode.appendRow(america)
        rootNode.appendRow(canada)

        treeView.setModel(treeModel)
        treeView.expandAll()
        treeView.doubleClicked.connect(self.getValue)

        self.setCentralWidget(treeView)

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">getValue</span><span class="hljs-params">(self, val)</span>:</span>
        print(val.data())
        print(val.row())
        print(val.column())


app = QApplication(sys.argv)        

demo = AppDemo()
demo.show()

sys.exit(app.exec_())