【问题标题】:PyQT QAbstractProxyModel mapToSourcePyQT QAbstractProxyModel mapToSource
【发布时间】:2017-04-20 12:00:33
【问题描述】:

我已经将我的 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)

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

如果我在第一个屏幕截图中单击一行,我会在控制台中打印行号和列号,例如 8,2。 如果我单击第二个屏幕截图中的一行(打开代理过滤器的行),我会得到第 -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 列 叫约翰·多伊

【问题讨论】:

    标签: sqlite pyqt qsortfilterproxymodel


    【解决方案1】:

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

    我需要查看您的 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 即可获取真正的索引。

    【讨论】:

    • 非常感谢您的回复,我感觉在您的帮助下@jdi 我可以解决这个问题。我在原帖中添加了一个方法。
    • 是的。在您的示例中,您首先获取行和列。如果您首先添加我建议的检查,如果它是代理,则更改模型索引,其余的如果您的代码可以相同。
    • 就是这样!您提供的代码是我的问题的解决方案。衷心感谢您,这样我的申请就完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多