#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
PyQt4 conversion of Qt Basic Sort/Filter Example
The Basic Sort/Filter Model example illustrates how to use
QSortFilterProxyModel to perform basic sorting and filtering.
BEHAVIOUR:
=========
Data has been added, with both panels using the same
data model.
The data in the Sort/Filter panel is sorted by 'Sender'.
Clicking the column headers re-sorts the data.
NOTES:
=====
Changes to Window class:
- added public method setSourceModel()
- re-defined proxyView and sourceView as attributes
Module:
- added createMailModel()
- added addMail()
- modified main() to set the windows source model
last modified: 2012-01-30 jg
ref:
http://developer.qt.nokia.com/doc/qt-4.8/itemviews-basicsortfiltermodel.html
'''
from PyQt4.QtGui import (QApplication, QWidget, QGroupBox, QHBoxLayout, QLabel,
QVBoxLayout, QGridLayout, QTreeView, QSortFilterProxyModel,
QCheckBox, QLineEdit, QComboBox, QStandardItemModel)
from PyQt4.QtCore import (Qt, pyqtSlot, QRegExp, QDateTime, QDate, QTime)
class Window(QWidget):
def __init__(self, parent=None): # initialise base class
super(Window, self).__init__(parent)
layout = QVBoxLayout()
layout.addWidget(self._createSourcePanel())
layout.addWidget(self._createProxyPanel())
self.setLayout(layout)
# public methods ----------------------------------------------------------
def setSourceModel(self, model):
self._proxyModel.setSourceModel(model)
self._sourceView.setModel(model)
# private methods ---------------------------------------------------------
def _createSourcePanel(self):
sourceGroupBox = QGroupBox(self.tr("Original Model"))
self._sourceView = QTreeView()
self._sourceView.setRootIsDecorated(False)
self._sourceView.setAlternatingRowColors(True)
sourceLayout = QHBoxLayout()
sourceLayout.addWidget(self._sourceView)
sourceGroupBox.setLayout(sourceLayout)
return sourceGroupBox
def _createProxyPanel(self):
proxyGroupBox = QGroupBox(self.tr("Sorted/Filter Model"))
proxyView = QTreeView()
proxyView.setRootIsDecorated(False)
proxyView.setAlternatingRowColors(True)
proxyView.sortByColumn(1, Qt.AscendingOrder)
self._proxyModel = QSortFilterProxyModel()
self._proxyModel.setDynamicSortFilter(True)
proxyView.setModel(self._proxyModel)
proxyView.setSortingEnabled(True) # click col hdr to sort
proxyLayout = QVBoxLayout()
proxyLayout.addWidget(proxyView)
proxyLayout.addLayout(self._createProxyFilterPanel())
proxyGroupBox.setLayout(proxyLayout)
return proxyGroupBox
def _createProxyFilterPanel(self):
sortCaseSensitivityCheckBox = QCheckBox(self.tr("Case sensitive sorting"));
sortCaseSensitivityCheckBox.setChecked(True)
filterCaseSensitivityCheckBox = QCheckBox(self.tr("Case sensitive filter"));
filterCaseSensitivityCheckBox.setChecked(True)
filterPatternLineEdit = QLineEdit();
filterPatternLabel = QLabel(self.tr("&Filter pattern:"));
filterPatternLabel.setBuddy(filterPatternLineEdit);
filterSyntaxComboBox = QComboBox();
filterSyntaxComboBox.addItem(self.tr("Regular expression"), QRegExp.RegExp);
filterSyntaxComboBox.addItem(self.tr("Wildcard"), QRegExp.Wildcard);
filterSyntaxComboBox.addItem(self.tr("Fixed string"), QRegExp.FixedString);
filterSyntaxLabel = QLabel(self.tr("Filter &syntax:"));
filterSyntaxLabel.setBuddy(filterSyntaxComboBox);
filterColumnComboBox = QComboBox();
filterColumnComboBox.addItem(self.tr("Subject"));
filterColumnComboBox.addItem(self.tr("Sender"));
filterColumnComboBox.addItem(self.tr("Date"));
filterColumnComboBox.setCurrentIndex(1)
filterColumnLabel = QLabel(self.tr("Filter &column:"));
filterColumnLabel.setBuddy(filterColumnComboBox);
# connect signals/slots for event handling
filterPatternLineEdit.textChanged.connect(self._filterRegExpChanged)
filterSyntaxComboBox.currentIndexChanged.connect(self._filterRegExpChanged)
filterColumnComboBox.currentIndexChanged.connect(self._filterColumnChanged)
filterCaseSensitivityCheckBox.toggled.connect(self._filterRegExpChanged)
sortCaseSensitivityCheckBox.toggled.connect(self._sortChanged)
grid = QGridLayout()
grid.addWidget(filterPatternLabel, 0, 0)
grid.addWidget(filterPatternLineEdit, 0, 1)
grid.addWidget(filterSyntaxLabel, 1, 0)
grid.addWidget(filterSyntaxComboBox, 1, 1)
grid.addWidget(filterColumnLabel, 2, 0)
grid.addWidget(filterColumnComboBox, 2, 1)
grid.addWidget(filterCaseSensitivityCheckBox, 3, 0)
grid.addWidget(sortCaseSensitivityCheckBox, 3, 1, Qt.AlignRight)
return grid
# private slots -----------------------------------------------------------
@pyqtSlot()
def _filterRegExpChanged(self):
pass
@pyqtSlot()
def _filterColumnChanged(self):
pass
@pyqtSlot()
def _sortChanged(self):
pass
# createMailModel() ==========================================================
def createMailModel(parent):
# create, populate and return a 'QStandardItemModel' object
model = QStandardItemModel(0, 3, parent)
model.setHeaderData(0, Qt.Horizontal, parent.tr("Subject"))
model.setHeaderData(1, Qt.Horizontal, parent.tr("Sender"))
model.setHeaderData(2, Qt.Horizontal, parent.tr("Date"))
addMail(model, "Happy New Year!", "Grace K. ",
QDateTime(QDate(2006, 12, 31), QTime(17, 3)))
addMail(model, "Radically new concept", "Grace K. ",
QDateTime(QDate(2006, 12, 22), QTime(9, 44)))
addMail(model, "Accounts", "pascale@nospam.com",
QDateTime(QDate(2006, 12, 31), QTime(12, 50)))
addMail(model, "Expenses", "Joe Bloggs ",
QDateTime(QDate(2006, 12, 25), QTime(11, 39)))
addMail(model, "Re: Expenses", "Andy ",
QDateTime(QDate(2007, 1, 2), QTime(16, 5)))
addMail(model, "Re: Accounts", "Joe Bloggs ",
QDateTime(QDate(2007, 1, 3), QTime(14, 18)))
addMail(model, "Re: Accounts", "Andy ",
QDateTime(QDate(2007, 1, 3), QTime(14, 26)))
addMail(model, "Sports", "Linda Smith ",
QDateTime(QDate(2007, 1, 5), QTime(11, 33)))
addMail(model, "AW: Sports", "Rolf Newschweinstein ",
QDateTime(QDate(2007, 1, 5), QTime(12, 0)))
addMail(model, "RE: Sports", "Petra Schmidt ",
QDateTime(QDate(2007, 1, 5), QTime(12, 1)))
return model
# addMail() ==================================================================
def addMail(model, subject, sender, date):
# insert a row of data into the given model
model.insertRow(0)
model.setData(model.index(0, 0), subject)
model.setData(model.index(0, 1), sender)
model.setData(model.index(0, 2), date)
# main ========================================================================
def main():
import sys
app = QApplication(sys.argv)
mw = Window()
mw.setSourceModel(createMailModel(mw))
mw.setWindowTitle("Basic Sort/Filter Model - Part 2")
mw.resize(500, 450)
mw.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Tuesday, January 31, 2012
Qt 4.8 Basic Sort/Filter Model Example - Part 2
In Part 2 the underlying model is created and populated with demo data. The proxy view is initially set to sort alphabetically on the Sender column.
Labels:
Qt Basic Sort/Filter
