Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PyQt4 import QtCore, QtGui
- class MySortFilterProxyModel(QtGui.QSortFilterProxyModel):
- def __init__(self, parent=None):
- super(MySortFilterProxyModel, self).__init__(parent)
- self.minDate = QtCore.QDate()
- self.maxDate = QtCore.QDate()
- self.originalPalette = QtGui.QApplication.palette()
- self.changeStyle('Cleanlooks')
- def changeStyle(self, styleName):
- QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(styleName))
- QtGui.QApplication.setPalette(self.originalPalette)
- def setFilterMinimumDate(self, date):
- self.minDate = date
- self.invalidateFilter()
- def filterMinimumDate(self):
- return self.minDate
- def setFilterMaximumDate(self, date):
- self.maxDate = date
- self.invalidateFilter()
- def filterMaximumDate(self):
- return self.maxDate
- def filterAcceptsRow(self, sourceRow, sourceParent):
- index0 = self.sourceModel().index(sourceRow, 0, sourceParent)
- index1 = self.sourceModel().index(sourceRow, 1, sourceParent)
- index2 = self.sourceModel().index(sourceRow, 2, sourceParent)
- return ( (self.filterRegExp().indexIn(self.sourceModel().data(index0)) >= 0
- or self.filterRegExp().indexIn(self.sourceModel().data(index1)) >= 0)
- and self.dateInRange(self.sourceModel().data(index2)))
- def lessThan(self, left, right):
- leftData = self.sourceModel().data(left)
- rightData = self.sourceModel().data(right)
- if not isinstance(leftData, QtCore.QDate):
- emailPattern = QtCore.QRegExp("([\\w\\.]*@[\\w\\.]*)")
- if left.column() == 1 and emailPattern.indexIn(leftData) != -1:
- leftData = emailPattern.cap(1)
- if right.column() == 1 and emailPattern.indexIn(rightData) != -1:
- rightData = emailPattern.cap(1)
- return leftData < rightData
- def dateInRange(self, date):
- if isinstance(date, QtCore.QDateTime):
- date = date.date()
- return ( (not self.minDate.isValid() or date >= self.minDate)
- and (not self.maxDate.isValid() or date <= self.maxDate))
- class Window(QtGui.QWidget):
- def __init__(self):
- super(Window, self).__init__()
- self.proxyModel = MySortFilterProxyModel(self)
- self.proxyModel.setDynamicSortFilter(True)
- self.sourceView = QtGui.QTreeView()
- self.sourceView.setRootIsDecorated(False)
- self.sourceView.setAlternatingRowColors(True)
- self.filterCaseSensitivityCheckBox = QtGui.QCheckBox("Учитывать регистр")
- self.filterCaseSensitivityCheckBox.setChecked(True)
- self.filterPatternLineEdit = QtGui.QLineEdit()
- self.filterPatternLineEdit.setText("Grace|Sports")
- filterPatternLabel = QtGui.QLabel("&Условие фильтрации:")
- filterPatternLabel.setBuddy(self.filterPatternLineEdit)
- self.filterSyntaxComboBox = QtGui.QComboBox()
- self.filterSyntaxComboBox.addItem("Регулярное выражение", QtCore.QRegExp.RegExp)
- self.filterSyntaxComboBox.addItem("Шаблон", QtCore.QRegExp.Wildcard)
- self.filterSyntaxComboBox.addItem("Заданная строка", QtCore.QRegExp.FixedString)
- self.fromDateEdit = QtGui.QDateEdit()
- self.fromDateEdit.setDate(QtCore.QDate(2006, 12, 22))
- self.fromDateEdit.setCalendarPopup(True)
- fromLabel = QtGui.QLabel("&Начальная дата:")
- fromLabel.setBuddy(self.fromDateEdit)
- self.toDateEdit = QtGui.QDateEdit()
- self.toDateEdit.setDate(QtCore.QDate(2007, 1, 5))
- self.toDateEdit.setCalendarPopup(True)
- toLabel = QtGui.QLabel("&Конечная дата:")
- toLabel.setBuddy(self.toDateEdit)
- self.filterPatternLineEdit.textChanged.connect(self.textFilterChanged)
- self.filterSyntaxComboBox.currentIndexChanged.connect(self.textFilterChanged)
- self.filterCaseSensitivityCheckBox.toggled.connect(self.textFilterChanged)
- self.fromDateEdit.dateChanged.connect(self.dateFilterChanged)
- self.toDateEdit.dateChanged.connect(self.dateFilterChanged)
- self.proxyView = QtGui.QTreeView()
- self.proxyView.setRootIsDecorated(False)
- self.proxyView.setAlternatingRowColors(True)
- self.proxyView.setModel(self.proxyModel)
- self.proxyView.setSortingEnabled(True)
- self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder)
- self.textFilterChanged()
- self.dateFilterChanged()
- proxyLayout = QtGui.QGridLayout()
- proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
- proxyLayout.addWidget(filterPatternLabel, 1, 0)
- proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1)
- proxyLayout.addWidget(self.filterSyntaxComboBox, 1, 2)
- proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 2, 0, 1, 3)
- proxyLayout.addWidget(fromLabel, 3, 0)
- proxyLayout.addWidget(self.fromDateEdit, 3, 1, 1, 2)
- proxyLayout.addWidget(toLabel, 4, 0)
- proxyLayout.addWidget(self.toDateEdit, 4, 1, 1, 2)
- proxyGroupBox = QtGui.QGroupBox("Список заявок")
- proxyGroupBox.setLayout(proxyLayout)
- mainLayout = QtGui.QVBoxLayout()
- mainLayout.addWidget(proxyGroupBox)
- self.setLayout(mainLayout)
- self.setWindowTitle("A little Help Desk")
- self.resize(700, 500)
- def setSourceModel(self, model):
- self.proxyModel.setSourceModel(model)
- self.sourceView.setModel(model)
- def textFilterChanged(self):
- syntax = QtCore.QRegExp.PatternSyntax(
- self.filterSyntaxComboBox.itemData(
- self.filterSyntaxComboBox.currentIndex()))
- caseSensitivity = (
- self.filterCaseSensitivityCheckBox.isChecked()
- and QtCore.Qt.CaseSensitive or QtCore.Qt.CaseInsensitive)
- regExp = QtCore.QRegExp(self.filterPatternLineEdit.text(), caseSensitivity, syntax)
- self.proxyModel.setFilterRegExp(regExp)
- def dateFilterChanged(self):
- self.proxyModel.setFilterMinimumDate(self.fromDateEdit.date())
- self.proxyModel.setFilterMaximumDate(self.toDateEdit.date())
- def addMail(model, subject, sender, date):
- model.insertRow(0)
- model.setData(model.index(0, 0), subject)
- model.setData(model.index(0, 1), sender)
- model.setData(model.index(0, 2), date)
- def createMailModel(parent):
- model = QtGui.QStandardItemModel(0, 3, parent)
- model.setHeaderData(0, QtCore.Qt.Horizontal, "Subject")
- model.setHeaderData(1, QtCore.Qt.Horizontal, "Sender")
- model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
- QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(17, 3)))
- QtCore.QDateTime(QtCore.QDate(2006, 12, 22), QtCore.QTime(9, 44)))
- QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(12, 50)))
- QtCore.QDateTime(QtCore.QDate(2006, 12, 25), QtCore.QTime(11, 39)))
- QtCore.QDateTime(QtCore.QDate(2007, 1, 2), QtCore.QTime(16, 5)))
- QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 18)))
- QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 26)))
- QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(11, 33)))
- QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 0)))
- 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_())
Advertisement
Add Comment
Please, Sign In to add comment