Guest User

Sort

a guest
May 19th, 2013
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.42 KB | None | 0 0
  1. from PyQt4 import QtCore, QtGui
  2.  
  3. class MySortFilterProxyModel(QtGui.QSortFilterProxyModel):
  4.     def __init__(self, parent=None):
  5.         super(MySortFilterProxyModel, self).__init__(parent)
  6.  
  7.         self.minDate = QtCore.QDate()
  8.         self.maxDate = QtCore.QDate()
  9.  
  10.         self.originalPalette = QtGui.QApplication.palette()
  11.         self.changeStyle('Cleanlooks')
  12.  
  13.     def changeStyle(self, styleName):
  14.         QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(styleName))
  15.         QtGui.QApplication.setPalette(self.originalPalette)
  16.        
  17.     def setFilterMinimumDate(self, date):
  18.         self.minDate = date
  19.         self.invalidateFilter()
  20.  
  21.     def filterMinimumDate(self):
  22.         return self.minDate
  23.  
  24.     def setFilterMaximumDate(self, date):
  25.         self.maxDate = date
  26.         self.invalidateFilter()
  27.  
  28.     def filterMaximumDate(self):
  29.         return self.maxDate
  30.  
  31.     def filterAcceptsRow(self, sourceRow, sourceParent):
  32.         index0 = self.sourceModel().index(sourceRow, 0, sourceParent)
  33.         index1 = self.sourceModel().index(sourceRow, 1, sourceParent)
  34.         index2 = self.sourceModel().index(sourceRow, 2, sourceParent)
  35.  
  36.         return (   (self.filterRegExp().indexIn(self.sourceModel().data(index0)) >= 0
  37.                     or self.filterRegExp().indexIn(self.sourceModel().data(index1)) >= 0)
  38.                 and self.dateInRange(self.sourceModel().data(index2)))
  39.  
  40.     def lessThan(self, left, right):
  41.         leftData = self.sourceModel().data(left)
  42.         rightData = self.sourceModel().data(right)
  43.  
  44.         if not isinstance(leftData, QtCore.QDate):
  45.             emailPattern = QtCore.QRegExp("([\\w\\.]*@[\\w\\.]*)")
  46.  
  47.             if left.column() == 1 and emailPattern.indexIn(leftData) != -1:
  48.                 leftData = emailPattern.cap(1)
  49.  
  50.             if right.column() == 1 and emailPattern.indexIn(rightData) != -1:
  51.                 rightData = emailPattern.cap(1)
  52.  
  53.         return leftData < rightData
  54.  
  55.     def dateInRange(self, date):
  56.         if isinstance(date, QtCore.QDateTime):
  57.             date = date.date()
  58.  
  59.         return (    (not self.minDate.isValid() or date >= self.minDate)
  60.                 and (not self.maxDate.isValid() or date <= self.maxDate))
  61.  
  62.  
  63. class Window(QtGui.QWidget):
  64.     def __init__(self):
  65.         super(Window, self).__init__()
  66.  
  67.         self.proxyModel = MySortFilterProxyModel(self)
  68.         self.proxyModel.setDynamicSortFilter(True)
  69.  
  70.         self.sourceView = QtGui.QTreeView()
  71.         self.sourceView.setRootIsDecorated(False)
  72.         self.sourceView.setAlternatingRowColors(True)
  73.  
  74.         self.filterCaseSensitivityCheckBox = QtGui.QCheckBox("Учитывать регистр")
  75.         self.filterCaseSensitivityCheckBox.setChecked(True)
  76.         self.filterPatternLineEdit = QtGui.QLineEdit()
  77.         self.filterPatternLineEdit.setText("Grace|Sports")
  78.         filterPatternLabel = QtGui.QLabel("&Условие фильтрации:")
  79.         filterPatternLabel.setBuddy(self.filterPatternLineEdit)
  80.         self.filterSyntaxComboBox = QtGui.QComboBox()
  81.         self.filterSyntaxComboBox.addItem("Регулярное выражение", QtCore.QRegExp.RegExp)
  82.         self.filterSyntaxComboBox.addItem("Шаблон", QtCore.QRegExp.Wildcard)
  83.         self.filterSyntaxComboBox.addItem("Заданная строка", QtCore.QRegExp.FixedString)
  84.         self.fromDateEdit = QtGui.QDateEdit()
  85.         self.fromDateEdit.setDate(QtCore.QDate(2006, 12, 22))
  86.         self.fromDateEdit.setCalendarPopup(True)
  87.         fromLabel = QtGui.QLabel("&Начальная дата:")
  88.         fromLabel.setBuddy(self.fromDateEdit)
  89.         self.toDateEdit = QtGui.QDateEdit()
  90.         self.toDateEdit.setDate(QtCore.QDate(2007, 1, 5))
  91.         self.toDateEdit.setCalendarPopup(True)
  92.         toLabel = QtGui.QLabel("&Конечная дата:")
  93.         toLabel.setBuddy(self.toDateEdit)
  94.  
  95.         self.filterPatternLineEdit.textChanged.connect(self.textFilterChanged)
  96.         self.filterSyntaxComboBox.currentIndexChanged.connect(self.textFilterChanged)
  97.         self.filterCaseSensitivityCheckBox.toggled.connect(self.textFilterChanged)
  98.         self.fromDateEdit.dateChanged.connect(self.dateFilterChanged)
  99.         self.toDateEdit.dateChanged.connect(self.dateFilterChanged)
  100.  
  101.         self.proxyView = QtGui.QTreeView()
  102.         self.proxyView.setRootIsDecorated(False)
  103.         self.proxyView.setAlternatingRowColors(True)
  104.         self.proxyView.setModel(self.proxyModel)
  105.         self.proxyView.setSortingEnabled(True)
  106.         self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder)
  107.  
  108.         self.textFilterChanged()
  109.         self.dateFilterChanged()
  110.  
  111.         proxyLayout = QtGui.QGridLayout()
  112.         proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
  113.         proxyLayout.addWidget(filterPatternLabel, 1, 0)
  114.         proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1)
  115.         proxyLayout.addWidget(self.filterSyntaxComboBox, 1, 2)
  116.         proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 2, 0, 1, 3)
  117.         proxyLayout.addWidget(fromLabel, 3, 0)
  118.         proxyLayout.addWidget(self.fromDateEdit, 3, 1, 1, 2)
  119.         proxyLayout.addWidget(toLabel, 4, 0)
  120.         proxyLayout.addWidget(self.toDateEdit, 4, 1, 1, 2)
  121.         proxyGroupBox = QtGui.QGroupBox("Список заявок")
  122.         proxyGroupBox.setLayout(proxyLayout)
  123.  
  124.         mainLayout = QtGui.QVBoxLayout()
  125.         mainLayout.addWidget(proxyGroupBox)
  126.         self.setLayout(mainLayout)
  127.  
  128.         self.setWindowTitle("A little Help Desk")
  129.         self.resize(700, 500)
  130.  
  131.     def setSourceModel(self, model):
  132.         self.proxyModel.setSourceModel(model)
  133.         self.sourceView.setModel(model)
  134.  
  135.     def textFilterChanged(self):
  136.         syntax = QtCore.QRegExp.PatternSyntax(
  137.             self.filterSyntaxComboBox.itemData(
  138.                 self.filterSyntaxComboBox.currentIndex()))
  139.         caseSensitivity = (
  140.             self.filterCaseSensitivityCheckBox.isChecked()
  141.             and QtCore.Qt.CaseSensitive or QtCore.Qt.CaseInsensitive)
  142.         regExp = QtCore.QRegExp(self.filterPatternLineEdit.text(), caseSensitivity, syntax)
  143.         self.proxyModel.setFilterRegExp(regExp)
  144.  
  145.     def dateFilterChanged(self):
  146.         self.proxyModel.setFilterMinimumDate(self.fromDateEdit.date())
  147.         self.proxyModel.setFilterMaximumDate(self.toDateEdit.date())
  148.  
  149.  
  150. def addMail(model, subject, sender, date):
  151.    
  152.     model.insertRow(0)
  153.     model.setData(model.index(0, 0), subject)
  154.     model.setData(model.index(0, 1), sender)
  155.     model.setData(model.index(0, 2), date)
  156.  
  157.  
  158. def createMailModel(parent):
  159.     model = QtGui.QStandardItemModel(0, 3, parent)
  160.  
  161.    
  162.     model.setHeaderData(0, QtCore.Qt.Horizontal, "Subject")
  163.     model.setHeaderData(1, QtCore.Qt.Horizontal, "Sender")
  164.     model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
  165.  
  166.     addMail(model, "Happy New Year!", "Grace K. <[email protected]>",
  167.             QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(17, 3)))
  168.     addMail(model, "Radically new concept", "Grace K. <[email protected]>",
  169.             QtCore.QDateTime(QtCore.QDate(2006, 12, 22), QtCore.QTime(9, 44)))
  170.     addMail(model, "Accounts", "[email protected]",
  171.             QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(12, 50)))
  172.     addMail(model, "Expenses", "Joe Bloggs <[email protected]>",
  173.             QtCore.QDateTime(QtCore.QDate(2006, 12, 25), QtCore.QTime(11, 39)))
  174.     addMail(model, "Re: Expenses", "Andy <[email protected]>",
  175.             QtCore.QDateTime(QtCore.QDate(2007, 1, 2), QtCore.QTime(16, 5)))
  176.     addMail(model, "Re: Accounts", "Joe Bloggs <[email protected]>",
  177.             QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 18)))
  178.     addMail(model, "Re: Accounts", "Andy <[email protected]>",
  179.             QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 26)))
  180.     addMail(model, "Sports", "Linda Smith <[email protected]>",
  181.             QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(11, 33)))
  182.     addMail(model, "AW: Sports", "Rolf Newschweinstein <[email protected]>",
  183.             QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 0)))
  184.     addMail(model, "RE: Sports", "Petra Schmidt <[email protected]>",
  185.             QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 1)))
  186.  
  187.     return model
  188.  
  189.  
  190. if __name__ == "__main__":
  191.  
  192.     import sys
  193.  
  194.     app = QtGui.QApplication(sys.argv)
  195.  
  196.     window = Window()
  197.     window.setSourceModel(createMailModel(window))
  198.     window.show()
  199.  
  200.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment