Я использую инфраструктуру pyqt4 для отображения некоторых форм базы данных. К сожалению, я столкнулся с проблемой при попытке отфильтровать и отобразить мою базу данных по фамилии. Предположим, что соединение с базой данных работает. Также предположим, что у меня есть правильное количество элементов в моем tupleHeader, так как я использую тот же метод initializeModel для других методов (например, функцию search (), описанную ниже, и она отлично работает.
Я вызываю функцию display (), и она отлично работает, но при создании proxyModel из sourceModel и при попытке отобразить proxyModel с помощью моей функции поиска у меня отображаются пустые ячейки. Когда я ограничиваю свой поиск, чтобы он фильтровал половину моей базы данных, он показывает, что много ячеек (так что большая часть этого работает). Но он не будет отображать ничего из самой базы данных.
Ниже приведен мой код:
from PyQt4 import QtGui, QtCore, QtSql
self.caseSensitivity = QtCore.Qt.CaseInsensitive
self.syntax = QtCore.QRegExp.FixedString
def initializeModel(self, model):
model.setTable(self.table)
#model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
b = 0
for a in self.tupleHeader:
model.setHeaderData(b, QtCore.Qt.Horizontal, QtGui.qApp.tr(a))
b += 1
model.select()
def display(self):
'''reads all row data and displays it on a tableview'''
self.connectdb(self.db, self.localhost, self.dbname, self.username, self.password)
model = QtSql.QSqlTableModel()
self.initializeModel(model)
self.view.setModel(model)
self.disconnectdb(self.db)
def search(self, searchQuery):
'''queries database data, filters it, and displays it on a tableview'''
sourceModel = QtSql.QSqlTableModel()
proxyModel = QtGui.QSortFilterProxyModel()
self.initializeModel(sourceModel)
proxyModel.setSourceModel(sourceModel) # allows to edit proxyModel without changing underying model
#searchQuery contains the last name that I am filtering with
regExp = QtCore.QRegExp(searchQuery, self.caseSensitivity, self.syntax)
proxyModel.setFilterRegExp(regExp)
proxyModel.setFilterKeyColumn(2) # this column holds the last names
# self.view contains the table itemview my application uses to display the database
self.view.setModel(proxyModel)
РЕДАКТИРОВАТЬ: я не заинтересован в сохранении этого фрагмента кода, я просто хочу знать, почему он позволяет таблице отображать содержимое таблицы вместо группы пустых ячеек
print self.proxyModel.filterAcceptsRow(2, self.sourceModel)
Кроме того, если вы вставите это после последнего оператора (self.view.setModel (proxyModel)), он покажет таблицу, даже если он отправит ошибку:
print self.proxyModel.filterAcceptsRow (2, self.sourceModel)
TypeError: QSortFilterProxyModel.filterAcceptsRow (int, QModelIndex): аргумент 2 имеет непредвиденный тип 'QSqlTableModel'
Неважно, каковы аргументы или я использую filterAcceptsRow ro filterAcceptsColumn, он отображает таблицу. Это сужает проблему?
Спасибо, что уделили время на поиск этой ошибки / ошибки кодирования и счастливой охоты!