Developing pyqt4 tree widget

10,658

I recommend you to use QTreeWidget instead of QTreeView, because your tasks are pretty simple. QTreeView (with custom model, for example QStandardItemModel) is for difficult events. Yours is simple.

import sys
from PyQt4 import QtCore, QtGui


class Window(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.treeWidget = QtGui.QTreeWidget()
        self.treeWidget.setHeaderHidden(True)
        self.addItems(self.treeWidget.invisibleRootItem())
        self.treeWidget.itemChanged.connect (self.handleChanged)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.treeWidget)
        self.setLayout(layout)

    def addItems(self, parent):
        column = 0
        clients_item = self.addParent(parent, column, 'Clients', 'data Clients')
        vendors_item = self.addParent(parent, column, 'Vendors', 'data Vendors')
        time_period_item = self.addParent(parent, column, 'Time Period', 'data Time Period')

        self.addChild(clients_item, column, 'Type A', 'data Type A')
        self.addChild(clients_item, column, 'Type B', 'data Type B')

        self.addChild(vendors_item, column, 'Mary', 'data Mary')
        self.addChild(vendors_item, column, 'Arnold', 'data Arnold')

        self.addChild(time_period_item, column, 'Init', 'data Init')
        self.addChild(time_period_item, column, 'End', 'data End')

    def addParent(self, parent, column, title, data):
        item = QtGui.QTreeWidgetItem(parent, [title])
        item.setData(column, QtCore.Qt.UserRole, data)
        item.setChildIndicatorPolicy(QtGui.QTreeWidgetItem.ShowIndicator)
        item.setExpanded (True)
        return item

    def addChild(self, parent, column, title, data):
        item = QtGui.QTreeWidgetItem(parent, [title])
        item.setData(column, QtCore.Qt.UserRole, data)
        item.setCheckState (column, QtCore.Qt.Unchecked)
        return item

    def handleChanged(self, item, column):
        if item.checkState(column) == QtCore.Qt.Checked:
            print "checked", item, item.text(column)
        if item.checkState(column) == QtCore.Qt.Unchecked:
            print "unchecked", item, item.text(column)

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
Share:
10,658
Arthur Portas
Author by

Arthur Portas

I'm a computer science engineer, and ii'm currently working on my master thesis, at University of Minho, Braga.

Updated on June 24, 2022

Comments

  • Arthur Portas
    Arthur Portas about 2 years

    i need to write a tree?, in pyqt. It looks like this:

    Clients(this is text)  
       Type A (this is a Clients child and has a checkbox)  
        Type B (this is a Clients child and has a checkbox)  
    Vendors(this is text) 
        Mary  (this is a Vendors child and has a checkbox)   
        Arnold  (this is a Vendors child and has a checkbox)  
    Time Period  
        Init(this is a Time Period child, and would be a calendarWidget for date selection)  
        End (this is a Time Period child, and would be a calendarWidget for date selection)  
    

    What would you recommend for this? QTreeWidget? QTreeView? This will be clickable items that i'll use to build sql queries.
    Thanks for reading.

  • NuclearPeon
    NuclearPeon over 10 years
    Links to QTreeWidget and QTreeView are broken. This is their API: pyqt.sourceforge.net/Docs/PyQt4/classes.html