Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Проблема с большой таблицей. QSqlQueryModel + QTableView [RSS Feed]

#1 Март 12, 2012 10:13:35

reychal
От:
Зарегистрирован: 2010-12-14
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с большой таблицей. QSqlQueryModel + QTableView

Здравствуйте.
Создаю 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)

Офлайн

#2 Март 12, 2012 11:46:48

reychal
От:
Зарегистрирован: 2010-12-14
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с большой таблицей. QSqlQueryModel + QTableView

Этот фильтр отрабатывает нормально. Похоже, что проблема из-за загрузки данных в таблицу кусками, примерно по 256 строк. Соответственно, если в загруженной партии нет соответствующего значения, то после фильтрации получается пустой экран. При прокрутке ползунка таблицы вниз загружаются новые строки. Когда все данные загружены, фильтрация работает. Из-за чего в таблицу загружаются строки поэтапно и как это обойти?



Офлайн

  • Начало
  • » GUI
  • » Проблема с большой таблицей. QSqlQueryModel + QTableView[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version