Page List

Friday, January 27, 2012

Qt 4.8 Model/View Tutorial - Part 6

The following code is based on Qt 4.8 Model/View Tutorial - 3.1 Tree View.



#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
    PyQt4 conversion of Qt Model-View Tutorial
    
    We use QStandardItemModel, which is a container for hierarchical 
    data that also implements QAbstractItemModel. 
    To show a tree, QStandardItemModel must be populated with 
    QStandardItems, which are able to hold all the standard properties 
    of items like text, fonts, checkboxes or brushes.
     
    NOTES:
    =====
      The original C++ code did not include:
          stdModel.setColumnCount(COLUMNS)
      so only one column was being displayed
      
      QList is not implemented in PyQt4, a standard Python
      list is used instead.
      
last modified: 2012-01-28 jg
ref:
    http://developer.qt.nokia.com/doc/qt-4.8/modelview.html#3-1-treeview
    
'''
from PyQt4.QtGui import (QApplication, QMainWindow, QTreeView, QStandardItem,
                         QStandardItemModel)

ROWS = 2
COLUMNS = 3

class MainWindow(QMainWindow):
    def __init__(self, parent=None):    # initialise base class
        super(MainWindow, self).__init__(parent)

        treeView = QTreeView(self)
        self.setCentralWidget(treeView)
        stdModel = QStandardItemModel()
        stdModel.setColumnCount(COLUMNS)    # columns to display

        # create the first row of items and assign it to the
        # tree root
        preparedRow = self.prepareRow("first", "second", "third")
        item = stdModel.invisibleRootItem()
        item.appendRow(preparedRow)

        # add a second row of items to the first item in the first row
        secondRow = self.prepareRow("111", '222', '333')
        preparedRow.appendRow(secondRow)

        treeView.setModel(stdModel)
        treeView.expandAll()

    def prepareRow(self, first, second, third):
        # create a list of QStandardItems
        items = []
        items.append(QStandardItem(first))
        items.append(QStandardItem(second))
        items.append(QStandardItem(third))

        # create a QStandardItem and add the list
        # as a row
        rowItems = QStandardItem()
        rowItems.appendRow(items)

        return rowItems


# main ========================================================================
def main():
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.setWindowTitle("Tree View")
    mw.show()

    sys.exit(app.exec_())

if __name__ == '__main__':
    main()