1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| # -*- coding: utf-8 -*-
#!/usr/bin/env python
# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QVariant', 2)
from PyQt4 import QtCore, QtGui
import unicodedata
SUBJECT, SENDER, DATE = range(3)
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.proxyModel = QtGui.QSortFilterProxyModel()
self.proxyModel.setDynamicSortFilter(True)
self.proxyModel.setFilterKeyColumn(SUBJECT)
self.proxyModel.setFilterRole(QtCore.Qt.UserRole)
self.sourceGroupBox = QtGui.QGroupBox("Original Model")
self.proxyGroupBox = QtGui.QGroupBox("Sorted/Filtered Model")
self.sourceView = QtGui.QTreeView()
self.sourceView.setRootIsDecorated(False)
self.sourceView.setAlternatingRowColors(True)
self.proxyView = QtGui.QTreeView()
self.proxyView.setRootIsDecorated(False)
self.proxyView.setAlternatingRowColors(True)
self.proxyView.setModel(self.proxyModel)
self.proxyView.setSortingEnabled(True)
self.sortCaseSensitivityCheckBox = QtGui.QCheckBox("Case sensitive sorting")
self.filterCaseSensitivityCheckBox = QtGui.QCheckBox("Case sensitive filter")
self.filterPatternLineEdit = QtGui.QLineEdit()
self.filterPatternLabel = QtGui.QLabel("&Filter pattern:")
self.filterPatternLabel.setBuddy(self.filterPatternLineEdit)
self.filterPatternLineEdit.textChanged.connect(self.filterRegExpChanged)
self.filterCaseSensitivityCheckBox.toggled.connect(self.filterRegExpChanged)
self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged)
sourceLayout = QtGui.QHBoxLayout()
sourceLayout.addWidget(self.sourceView)
self.sourceGroupBox.setLayout(sourceLayout)
proxyLayout = QtGui.QGridLayout()
proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
proxyLayout.addWidget(self.filterPatternLabel, 1, 0)
proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2)
proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2)
proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2)
self.proxyGroupBox.setLayout(proxyLayout)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(self.sourceGroupBox)
mainLayout.addWidget(self.proxyGroupBox)
self.setLayout(mainLayout)
self.setWindowTitle("Basic Sort/Filter Model")
self.resize(500, 450)
self.proxyView.sortByColumn(SUBJECT, QtCore.Qt.AscendingOrder)
self.filterPatternLineEdit.setText("test")
self.filterCaseSensitivityCheckBox.setChecked(True)
self.sortCaseSensitivityCheckBox.setChecked(True)
def setSourceModel(self, model):
self.proxyModel.setSourceModel(model)
self.sourceView.setModel(model)
def filterRegExpChanged(self):
if self.filterCaseSensitivityCheckBox.isChecked():
caseSensitivity = QtCore.Qt.CaseSensitive
else:
caseSensitivity = QtCore.Qt.CaseInsensitive
stripedFilter = ''.join((c for c in unicodedata.normalize('NFD', self.filterPatternLineEdit.text()) if unicodedata.category(c) != 'Mn'))
regExp = QtCore.QRegExp(stripedFilter,caseSensitivity)
self.proxyModel.setFilterRegExp(regExp)
def sortChanged(self):
if self.sortCaseSensitivityCheckBox.isChecked():
caseSensitivity = QtCore.Qt.CaseSensitive
else:
caseSensitivity = QtCore.Qt.CaseInsensitive
self.proxyModel.setSortCaseSensitivity(caseSensitivity)
def addMail(model, subject, sender, date):
model.insertRow(0)
model.setData(model.index(0, SUBJECT), subject)
model.setData(model.index(0, SUBJECT), \
''.join((c for c in unicodedata.normalize('NFD', subject) if unicodedata.category(c) != 'Mn')),QtCore.Qt.UserRole)
model.setData(model.index(0, SENDER), sender)
model.setData(model.index(0, DATE), date)
def createMailModel(parent):
model = QtGui.QStandardItemModel(0, 3, parent)
model.setHeaderData(SUBJECT, QtCore.Qt.Horizontal, "Subject")
model.setHeaderData(SENDER, QtCore.Qt.Horizontal, "Sender")
model.setHeaderData(DATE, QtCore.Qt.Horizontal, "Date")
addMail(model, "test", "Grace K. <grace@software-inc.com>",
QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(17, 3)))
addMail(model, "tést", "Grace K. <grace@software-inc.com>",
QtCore.QDateTime(QtCore.QDate(2006, 12, 22), QtCore.QTime(9, 44)))
addMail(model, "tèst", "pascale@nospam.com",
QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(12, 50)))
addMail(model, "têst", "Joe Bloggs <joe@bloggs.com>",
QtCore.QDateTime(QtCore.QDate(2006, 12, 25), QtCore.QTime(11, 39)))
addMail(model, "tëst", "Andy <andy@nospam.com>",
QtCore.QDateTime(QtCore.QDate(2007, 1, 2), QtCore.QTime(16, 5)))
addMail(model, "Sports", "Linda Smith <linda.smith@nospam.com>",
QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(11, 33)))
addMail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>",
QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 0)))
addMail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>",
QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 1)))
return model
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setSourceModel(createMailModel(window))
window.show()
sys.exit(app.exec_()) |
Partager