#!/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