0

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

在此处输入图像描述

对不起,塞尔维亚的信件,不过你会明白我在说什么。

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)

屏幕截图 2,在 searchName 函数之后。再次,请原谅我的塞尔维亚字母。现在的问题;

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

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

:编辑:

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

4

1 回答 1

3

让我先向你保证......塞尔维亚字母一点也不麻烦:-)

我需要查看您的 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 '方法,如果有,那么我们知道它是一个代理。所以我们只需调用mapToSourceProxyIndex 来获取真正的索引。

于 2012-07-16T03:30:13.233 回答