在PyQt的QTableView中指定索引

1 投票
2 回答
10920 浏览
提问于 2025-04-17 06:28

我有一个表格,想查看特定位置的数据,比如第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 个回答

2

为了让大家更明白为什么问题中的代码不管用,先来解释一下:

QTableView.indexAt 这个方法是用来获取屏幕上某个点对应的表格数据的(相对于表格控件来说)。比如说,QPoint(2, 5) 代表的是从表格左上角开始,向右移动2个像素,向下移动5个像素的位置——这个位置其实对应的是表格中第0行、第1列的数据!

所以,indexAt 可以用来获取当前鼠标指针下的表格数据。

正如DK的回答中提到的,要获取特定行和列的数据,应该去查找表格视图的 模型 中的索引。

5

如果你想获取某个特定行和列的内容,可以使用 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,也就是你在指定的单元格中看到的显示文本,前提是你没有在编辑这个单元格。

撰写回答