Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf-8
- import os
- import sys
- from decimal import *
- from collections import Sequence
- from PyQt4 import (QtGui, QtCore, QtSql, Qt)
- class SuperiorQSortFilterProxyModel3000(QtGui.QSortFilterProxyModel):
- def __init__(self, parent=None):
- super(SuperiorQSortFilterProxyModel3000, self).__init__(parent)
- def filterAcceptsRow(self, row_num, parent):
- if row_num == 0:
- return True
- model = self.sourceModel()
- # row = model.row(row_num)
- row = model.data(parent, QtCore.Qt.DisplayRole)
- # model.data(model.index(row_num, self.filterKeyColumn(), parent))
- tests = [self.filterString in row[col]
- for col in self.filterColumns]
- return True in tests
- class SuperiorSqlTableView3000(QtGui.QTableView):
- _columnNames = []
- _columnFilters = None
- def __init__(self, parent, db_type, db_name, **kwargs):
- super(SuperiorSqlTableView3000, self).__init__(parent)
- self._db = QtSql.QSqlDatabase.addDatabase(db_type)
- self._db.setDatabaseName(db_name)
- if kwargs.get('hostname', None):
- self._db.setHostName(kwargs.get('hostname'))
- if kwargs.get('username', None):
- self._db.setUserName(kwargs.get('username'))
- if kwargs.get('password', None):
- self._db.setPassword(kwargs.get('password'))
- if not self._db.open():
- error = self._db.lastError()
- raise Exception('Невозможно открыть БД или нет связи с сервером! (%s, %s)' % (error.driverText(), error.databaseText()))
- self._model = QtSql.QSqlTableModel(self, self._db)
- self._proxy = SuperiorQSortFilterProxyModel3000(self)
- self._proxy.setSourceModel(self._model)
- self.setSelectionBehavior(Qt.QAbstractItemView.SelectRows)
- def openQuery(self, query):
- self._model.setQuery(QtSql.QSqlQuery(query))
- self.setModel(self._proxy)
- self.resizeColumnsToContents()
- self.getColumnNames()
- self.initFilters()
- return
- def getColumnNames(self):
- self._columnNames = []
- for i in range(0, self._proxy.columnCount()):
- self._columnNames.append(self._proxy.headerData(i, 0x1, 0))
- return
- def populateFilters(self):
- for row in range(1, self._proxy.rowCount()):
- for column in range(0, self._proxy.columnCount()):
- index = self._proxy.index(row, column)
- print(self._proxy.itemData(index))
- column_name = self._proxy.headerData(column, 0x1, 0)
- self._columnFilters[column_name].addItem(self._proxy.itemData(index)[0])
- for column_name, widget in self._columnFilters.items():
- widget.currentIndexChanged.connect(lambda: self.onIndexChanged(column_name, widget))
- widget.editTextChanged.connect(lambda: self.onTextChanged(column_name, widget))
- return
- def onIndexChanged(self, column_name, widget):
- exact_string = widget.currentText()
- filter_string = QtCore.QRegExp(exact_string,
- QtCore.Qt.CaseSensitive,
- QtCore.QRegExp.FixedString)
- self._proxy.setFilterRegExp(filter_string)
- self._proxy.setFilterKeyColumn(self._model.fieldIndex(column_name))
- def onTextChanged(self, column_name, widget):
- #widget.BlockSignals(True)
- #widget.BlockSignals(False)
- pass
- def initFilters(self):
- self._proxy.insertRow(0, QtCore.QModelIndex())
- self._columnFilters = dict()
- for column in self._columnNames:
- widget = QtGui.QComboBox()
- widget.setEditable(True)
- self._columnFilters.update({
- column: widget
- })
- for i in range(0, self._proxy.columnCount()):
- column_name = self._proxy.headerData(i, 0x1, 0)
- column_index = self._proxy.index(0, i)
- self.setIndexWidget(column_index, self._columnFilters[column_name])
- self.populateFilters()
- return
- def filterColumnByValue(self):
- pass
- class GeoPointsFilterForm(QtGui.QWidget):
- db = None
- geoPoints = []
- def __init__(self, **kwargs):
- super(GeoPointsFilterForm, self).__init__(**kwargs)
- self.window_init()
- # self.view = SuperiorSqlTableView3000(self, 'QODBC', 'DRIVER={SQL Server};Server=ggs;Database=GEO_RUT')
- self.view = SuperiorSqlTableView3000(self, 'QPSQL', 'alexika', hostname='localhost', port='5432', username='postgres', password='72946.penta')
- self.view.openQuery("select name, label from main_menu;")
- self.view.resize(600, 400)
- self.view.move(10, 100)
- self.show()
- def window_init(self):
- self.setFixedSize(1024, 600)
- self.setWindowTitle('Скважины')
- app = QtGui.QApplication(sys.argv)
- window = GeoPointsFilterForm()
- sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement