PyQt4: моя база данных отображает пустые ячейки - PullRequest
1 голос
/ 08 июня 2010

Я использую инфраструктуру 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, он отображает таблицу. Это сужает проблему?

Спасибо, что уделили время на поиск этой ошибки / ошибки кодирования и счастливой охоты!

1 Ответ

0 голосов
/ 10 июня 2010

Хотя я не мог найти решение своей проблемы, он решил сам. Я не уверен, но я думаю, что именно этот фрагмент кода заставил его работать.

self.dbmanip = CoreDB(self.userTableView, self.table)

Это было помещено в метод SetupUi (), созданный Qt4 Designer. Я думаю, что либо dbmanip, содержащий TableView, потерял информацию из proxyModel, либо (что более вероятно), я мог сослаться на неверную таблицу между proxyModel и исходной моделью (которая создала proxyModel), а затем не мог отобразиться это вызывало структуру ячейки из одной таблицы и фактическую информацию из другой.

Хотя это все догадки. Тем не менее, проблема решена.

...