Найти - Пользователи
Полная версия: Проблема с большой таблицей. QSqlQueryModel + QTableView
Начало » GUI » Проблема с большой таблицей. QSqlQueryModel + QTableView
1
reychal
Здравствуйте.
Создаю 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)
reychal
Этот фильтр отрабатывает нормально. Похоже, что проблема из-за загрузки данных в таблицу кусками, примерно по 256 строк. Соответственно, если в загруженной партии нет соответствующего значения, то после фильтрации получается пустой экран. При прокрутке ползунка таблицы вниз загружаются новые строки. Когда все данные загружены, фильтрация работает. Из-за чего в таблицу загружаются строки поэтапно и как это обойти?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB