2010-06-08 36 views
1

我正在使用pyqt4框架爲數據庫表單做一些顯示。不幸的是,我在嘗試按姓氏過濾和顯示數據庫時遇到了一些障礙。假定數據庫連接起作用。另外,假設我在我的tupleHeader中有正確數量的項目,因爲我對其他方法使用了相同的initializeModel方法(如下面描述的search()函數,並且它工作正常。)我調用display()函數並它工作的很好,但是當從sourceModel創建一個proxyModel,並嘗試使用我的搜索功能顯示proxyModel時,我顯示了空單元格。當我限制搜索以便過濾一半數據庫時,它顯示許多單元格。所以大多數的這工作),但它不會顯示數據庫本身什麼PyQt4:我的數據庫顯示空單元格

下面是我的一些代碼:

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))之後,它會顯示錶,即使它發送一個錯誤:

打印self.proxyModel.filterAcceptsRow(2 self.sourceModel) 類型錯誤:QSortFilterProxyModel.filterAcceptsRow(int,QModelIndex):參數2有意外的類型'QSqlTableModel'

無論參數是什麼或使用filterAcceptsRow ro filterAcceptsColumn都無關緊要,它會顯示錶格。這是否縮小了問題的範圍?

謝謝你的時間尋找這個編碼錯誤/錯誤,並開心狩獵!

回答

0

儘管我無法找到解決問題的辦法,但它解決了問題。我不確定,但我認爲這是使它工作的這段代碼片段。

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

這是放在由Qt4設計器創建的SetupUi()方法中。我認爲包含TableView的dbmanip丟失了來自proxyModel的信息,或者(更可能),我可能引用了proxyModel和原始模型(創建proxyModel)之間的錯誤表格,然後無法顯示,因爲它從一個表格調用單元格結構並從另一個表格調用實際的信息。

雖然這些都是猜測。仍然,問題解決了。

相關問題