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_())
Hey man, nice tutorial!
I was looking for a simple example of QTreeView and found it, thanks!
BTW:
canada = StandardItem(‘America’, 16, set_bold=True)
should say:
canada = StandardItem(‘Canada’, 16, set_bold=True)
It looks funny to have America twice 😉
Cheers
Did you get the column number correct?