Advertisement
Guest User

Untitled

a guest
Nov 10th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.04 KB | None | 0 0
  1. # coding: utf-8
  2.  
  3. import os
  4. import sys
  5.  
  6.  
  7. from decimal import *
  8. from collections import Sequence
  9.  
  10. from PyQt4 import (QtGui, QtCore, QtSql, Qt)
  11.  
  12.  
  13. class SuperiorQSortFilterProxyModel3000(QtGui.QSortFilterProxyModel):
  14. def __init__(self, parent=None):
  15. super(SuperiorQSortFilterProxyModel3000, self).__init__(parent)
  16.  
  17. def filterAcceptsRow(self, row_num, parent):
  18. if row_num == 0:
  19. return True
  20.  
  21. model = self.sourceModel()
  22.  
  23. # row = model.row(row_num)
  24. row = model.data(parent, QtCore.Qt.DisplayRole)
  25. # model.data(model.index(row_num, self.filterKeyColumn(), parent))
  26.  
  27. tests = [self.filterString in row[col]
  28. for col in self.filterColumns]
  29.  
  30. return True in tests
  31.  
  32.  
  33. class SuperiorSqlTableView3000(QtGui.QTableView):
  34. _columnNames = []
  35. _columnFilters = None
  36.  
  37. def __init__(self, parent, db_type, db_name, **kwargs):
  38. super(SuperiorSqlTableView3000, self).__init__(parent)
  39. self._db = QtSql.QSqlDatabase.addDatabase(db_type)
  40. self._db.setDatabaseName(db_name)
  41.  
  42. if kwargs.get('hostname', None):
  43. self._db.setHostName(kwargs.get('hostname'))
  44.  
  45. if kwargs.get('username', None):
  46. self._db.setUserName(kwargs.get('username'))
  47.  
  48. if kwargs.get('password', None):
  49. self._db.setPassword(kwargs.get('password'))
  50.  
  51. if not self._db.open():
  52. error = self._db.lastError()
  53. raise Exception('Невозможно открыть БД или нет связи с сервером! (%s, %s)' % (error.driverText(), error.databaseText()))
  54.  
  55. self._model = QtSql.QSqlTableModel(self, self._db)
  56. self._proxy = SuperiorQSortFilterProxyModel3000(self)
  57. self._proxy.setSourceModel(self._model)
  58. self.setSelectionBehavior(Qt.QAbstractItemView.SelectRows)
  59.  
  60. def openQuery(self, query):
  61. self._model.setQuery(QtSql.QSqlQuery(query))
  62. self.setModel(self._proxy)
  63.  
  64. self.resizeColumnsToContents()
  65.  
  66. self.getColumnNames()
  67. self.initFilters()
  68.  
  69. return
  70.  
  71. def getColumnNames(self):
  72. self._columnNames = []
  73. for i in range(0, self._proxy.columnCount()):
  74. self._columnNames.append(self._proxy.headerData(i, 0x1, 0))
  75. return
  76.  
  77. def populateFilters(self):
  78.  
  79. for row in range(1, self._proxy.rowCount()):
  80. for column in range(0, self._proxy.columnCount()):
  81. index = self._proxy.index(row, column)
  82. print(self._proxy.itemData(index))
  83.  
  84. column_name = self._proxy.headerData(column, 0x1, 0)
  85. self._columnFilters[column_name].addItem(self._proxy.itemData(index)[0])
  86.  
  87. for column_name, widget in self._columnFilters.items():
  88. widget.currentIndexChanged.connect(lambda: self.onIndexChanged(column_name, widget))
  89. widget.editTextChanged.connect(lambda: self.onTextChanged(column_name, widget))
  90. return
  91.  
  92. def onIndexChanged(self, column_name, widget):
  93. exact_string = widget.currentText()
  94. filter_string = QtCore.QRegExp(exact_string,
  95. QtCore.Qt.CaseSensitive,
  96. QtCore.QRegExp.FixedString)
  97.  
  98. self._proxy.setFilterRegExp(filter_string)
  99. self._proxy.setFilterKeyColumn(self._model.fieldIndex(column_name))
  100.  
  101. def onTextChanged(self, column_name, widget):
  102. #widget.BlockSignals(True)
  103. #widget.BlockSignals(False)
  104. pass
  105.  
  106. def initFilters(self):
  107.  
  108. self._proxy.insertRow(0, QtCore.QModelIndex())
  109.  
  110. self._columnFilters = dict()
  111. for column in self._columnNames:
  112. widget = QtGui.QComboBox()
  113. widget.setEditable(True)
  114. self._columnFilters.update({
  115. column: widget
  116. })
  117.  
  118. for i in range(0, self._proxy.columnCount()):
  119. column_name = self._proxy.headerData(i, 0x1, 0)
  120. column_index = self._proxy.index(0, i)
  121. self.setIndexWidget(column_index, self._columnFilters[column_name])
  122.  
  123. self.populateFilters()
  124.  
  125. return
  126.  
  127. def filterColumnByValue(self):
  128. pass
  129.  
  130. class GeoPointsFilterForm(QtGui.QWidget):
  131. db = None
  132. geoPoints = []
  133.  
  134. def __init__(self, **kwargs):
  135. super(GeoPointsFilterForm, self).__init__(**kwargs)
  136.  
  137. self.window_init()
  138.  
  139. # self.view = SuperiorSqlTableView3000(self, 'QODBC', 'DRIVER={SQL Server};Server=ggs;Database=GEO_RUT')
  140. self.view = SuperiorSqlTableView3000(self, 'QPSQL', 'alexika', hostname='localhost', port='5432', username='postgres', password='72946.penta')
  141. self.view.openQuery("select name, label from main_menu;")
  142. self.view.resize(600, 400)
  143. self.view.move(10, 100)
  144.  
  145. self.show()
  146.  
  147.  
  148. def window_init(self):
  149. self.setFixedSize(1024, 600)
  150. self.setWindowTitle('Скважины')
  151.  
  152. app = QtGui.QApplication(sys.argv)
  153. window = GeoPointsFilterForm()
  154. sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement