PyQT QAbstractProxyModel mapToSource

时间:2012-07-15 15:02:04

标签: sqlite pyqt qsortfilterproxymodel

我将QTableView设置为视图,该视图的模型是QSqlQueryModel。

enter image description here

对不起塞尔维亚语,你会明白我的意思。

self.model = QSqlQueryModel(self)
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("database.db")
db.open()

view = self.ui.myView
view.setVisible(True)
view.setSortingEnabled(True)
view.sortByColumn(2,Qt.AscendingOrder)
view.setModel(self.model)

view.clicked.connect(self.clickedSlot) #this function clickedSlot returns row and column numbers, which I use for extracting data from SQLite database.

def searchName(self): #this function searches the model for some name,lets say JOHN DOE`

    name = (str(self.ui.inputName.text()).upper())

    proxy = QSortFilterProxyModel()
    proxy.setSourceModel(self.model)
    proksi.setDynamicSortFilter(True)

    proxy.setFilterRegExp(QRegExp(name, Qt.CaseInsensitive))
    proxy.setFilterKeyColumn(1)

    view = self.ui.myView
    view.setVisible(False)
    view.resizeColumnsToContents()
    view.setVisible(True)
    view.setSortingEnabled(True)
    #view.sortByColumn(2,Qt.AscendingOrder)
    view.setModel(proxy)
    view.clicked.connect(self.clickedSlot)
在searchName函数之后

Screenshot 2。再次,请原谅我的塞尔维亚信件。现在问题;

如果我点击第一个屏幕截图中的一行,我会在控制台中打印行号和列号,如8,2。 如果我点击SECOND屏幕截图中的一行(代理过滤器打开一行),我会得到行-1,列-1。

我如何实现QAbstractProxyModel和mapToSource方法来获取REAL行号和列号?

:编辑:

def clickedSlot(self,index):
 rownumber = index.row()
 colnumber = index.column()
 self.model.setQuery("select name from cases")
 tempname = self.model.data(self.model.index(rownumber, 1))
 print("row " +str(rownumber))
 print("column " +str(colnumber))
 print("name " +str(tempname))

输出我得到了这个:

第9行 第1栏 名叫JOHN DOE

1 个答案:

答案 0 :(得分:2)

让我先说一下你的安慰......塞尔维亚的信件根本没有问题: - )

我需要确定SLOT self.clickedSlot的代码是确定的,但我的猜测是你在那时解析了行列错误。

假设self.ui.myViewQTableView并且您使用的是clicked()信号,那么您应该在clickedSlot中收到的代码是QModelIndex代理商模型。此时您应该能够执行以下操作:

def clickedSlot(self, modelIndex):
    model = modelIndex.model()
    if hasattr(model, 'mapToSource'):
        # We are a proxy model
        modelIndex = model.mapToSource(modelIndex)
    print modelIndex.row(), modelIndex.column() 

这只是检查代理的一种方法。也许你有一个标志集,你已经知道它的代理。但是在这里我只是检查索引上的模型引用是否具有“mapToSource”方法,如果是,那么我们就知道它是一个代理。因此,我们只需使用该ProxyIndex调用mapToSource即可获得真实索引。