在PyQt的QTableView中指定索引
我有一个表格,想查看特定位置的数据,比如第2行,第5列。我创建了一个QPoint对象,把这些值设置好,但当它转换成QModelIndex对象时,我却得到了第0行和第1列。
这是我的代码:
myQPoint = QPoint()
myQPoint.setX(2)
myQPoint.setY(5)
myIndex = self.view.indexAt(myQPoint) # myIndex is a QModelIndex object
print myQPoint.x(), myQPoint.y() # 2, 5
print myIndex.row(), myIndex.column() # 0, 1
根据文档,indexAt的意思是“返回与内容坐标中位置pos对应的表格项的模型项的索引位置。”那么,为什么我的myIndex的行和列值与myQPoint的x和y值不一样呢?我哪里做错了?有没有简单的方法可以直接设置QModelIndex对象的行和列值?
谢谢!
--Erin
2 个回答
为了让大家更明白为什么问题中的代码不管用,先来解释一下:
QTableView.indexAt
这个方法是用来获取屏幕上某个点对应的表格数据的(相对于表格控件来说)。比如说,QPoint(2, 5)
代表的是从表格左上角开始,向右移动2个像素,向下移动5个像素的位置——这个位置其实对应的是表格中第0行、第1列的数据!
所以,indexAt
可以用来获取当前鼠标指针下的表格数据。
正如DK的回答中提到的,要获取特定行和列的数据,应该去查找表格视图的 模型 中的索引。
如果你想获取某个特定行和列的内容,可以使用 QTableView.model().index(row, column).data()
这个方法。
QTableView.model(row, column)
会返回一个叫 QModelIndex
的对象(你可以在这里了解更多:http://doc.qt.nokia.com/latest/qmodelindex.html)。这个对象有一个 QModelIndex.data(role)
的方法。你可以指定你想要的角色(具体可以参考这里:http://doc.qt.nokia.com/latest/qt.html#ItemDataRole-enum),不过默认情况下使用的是 Qt.DisplayRole
,也就是你在指定的单元格中看到的显示文本,前提是你没有在编辑这个单元格。