Форум сайта python.su
Здравствуйте.
Создаю QTableView, которая содержит данные из нескольких таблиц БД. По умолчанию вывожу все существующие данные (сейчас около 50k строк). При прокрутке таблицы вниз появляются еще значения. Затем пытаюсь фильтровать по определенному столбцу при клике на другом виджете. Однако, таблица фильтроваться отказывается (показывает пустоту). Аналогичное значение, но в другой колонке отрабатывает. Может я что-то в принципе делаю не так? Подскажите как лучше это реализовать?
Частичный код:
class EditableSqlModel(QtSql.QSqlQueryModel):
def flags(self, index):
flags = super(EditableSqlModel, self).flags(index)
if index.column() >= 1 and index.column() != 5:
flags |= QtCore.Qt.ItemIsEditable
if index.column() == 5:
flags |= QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
return flags
def setData(self, index, value, role):
if index.column() == 0:
return False
primaryKeyIndex = self.index(index.row(), 0)
id = primaryKeyIndex.data(QtCore.Qt.EditRole)
print(index.row(), index.column(), value)
self.clear()
if index.column() == 1:
ok = self.setKey(id, value)
if index.column() == 5:
ok = self.setIn(id, value)
if role == QtCore.Qt.TextColorRole and index.column() == 1:
return QtGui.QColor(QtCore.Qt.blue)
self.refresh()
return ok
def data(self, index, role):
value = super(EditableSqlModel, self).data(index, role)
if value is not None and role == QtCore.Qt.DisplayRole:
if index.column() == 0:
return value
elif index.column() == 5:
if value != 0:
return str("Да")
else:
return str("Нет")
elif index.column() == 1:
return value.upper()
if role == QtCore.Qt.TextAlignmentRole:
if index.column() not in (0, 1, 5, 6):
return int(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
else:
return int(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
if role == QtCore.Qt.CheckStateRole and index.column() == 5:
value2 = super(EditableSqlModel, self).data(index)
if value2 != 0:
return QtCore.Qt.Checked
else:
return QtCore.Qt.Unchecked
if role == QtCore.Qt.TextColorRole and index.column() == 1:
return QtGui.QColor(QtCore.Qt.blue)
return value
def refresh(self):
self.setQuery('SELECT k.*, gk.*, kl.* FROM key AS k JOIN logs AS kl JOIN osnov AS os JOIN groups AS gk WHERE k.id = kl.key_id AND os.id=gk.sid AND k.id=gk.key_id ORDER BY k.id')
def setKey(self, keyId, key):
query = QtSql.QSqlQuery()
query.prepare('update key set key = ? where id = ?')
query.addBindValue(key)
query.addBindValue(keyId)
return query.exec_()
def setIn(self, keyId, ins):
mon = bool(ins)
if mon != False:
mon = 1
else:
mon = 0
query = QtSql.QSqlQuery()
query.prepare('update key set in = ? where id = ?')
query.addBindValue(int(mon))
query.addBindValue(keyId)
return query.exec_()
class CreateTableIn(object):
def initializeModel(self, data = None, model = None):
sql = 'SELECT k.*, gk.*, kl.* FROM key AS k JOIN logs AS kl JOIN osnov AS os JOIN groups AS gk WHERE k.id = kl.key_id AND os.id=gk.sid AND k.id=gk.key_id ORDER BY k.id'
if model == None:
model = EditableSqlModel()
model.setQuery(sql)
return model
def TableViewGet(self, model):
viewTable = QtGui.QTableView()
proxyTableModel = QtGui.QSortFilterProxyModel()
proxyTableModel.setDynamicSortFilter(True)
proxyTableModel.setSourceModel(model)
viewTable.setModel(proxyTableModel)
viewTable.setSortingEnabled(True)
viewTable.resizeColumnsToContents()
viewTable.setAlternatingRowColors(True)
return viewTable, proxyTableModel
def updateTableInfo(self, val1, val2):
regExp = QtCore.QRegExp(str(val1))
self.proxyTableModel.setFilterKeyColumn(2)
self.proxyTableModel.setFilterRegExp(regExp)
if val2 != 0:
self.proxyTableModel.setFilterFixedString(str(val2))
self.proxyTableModel.setFilterKeyColumn(3)
Отредактировано (Март 12, 2012 10:18:46)
Офлайн
Этот фильтр отрабатывает нормально. Похоже, что проблема из-за загрузки данных в таблицу кусками, примерно по 256 строк. Соответственно, если в загруженной партии нет соответствующего значения, то после фильтрации получается пустой экран. При прокрутке ползунка таблицы вниз загружаются новые строки. Когда все данные загружены, фильтрация работает. Из-за чего в таблицу загружаются строки поэтапно и как это обойти?
Офлайн