如何获取 QTableWidget 光标下的行
Posted
技术标签:
【中文标题】如何获取 QTableWidget 光标下的行【英文标题】:How to get the row under the cursor for a QTableWidget 【发布时间】:2014-07-09 09:11:54 【问题描述】:有没有办法获取鼠标指针下的行号?我想在不知道行号的情况下删除一行,而只使用光标位置。
编辑:
在此图像中,您可以为资源库添加项目。 单击删除箱时,应删除该行。最好的方法是在单击 bin 时查询鼠标指针下的 ROW 编号。其中行号被解析为 removeRow 函数。 我不知道如何使用 QPointer。并且 cellEntered 需要在添加或删除新行时不会保持不变的行/列值。
【问题讨论】:
【参考方案1】:有许多方法可以解决这个问题。有些可能涉及光标位置,有些可能涉及表事件和信号。使用 QCursor 解决此问题的一个问题是,如果有人使用键盘触发按钮而不是鼠标单击,这意味着光标位置可能无法反映正确的行。
既然你已经在使用高级QTableWidget
,那么这里有一个非常简单的方法:
from functools import partial
class Table(QtGui.QWidget):
def __init__(self):
super(Table, self).__init__()
self.table = QtGui.QTableWidget(3, 2, self)
for row in xrange(3):
item = QtGui.QTableWidgetItem("Item %d" % row)
self.table.setItem(row, 0, item)
button = QtGui.QPushButton("X", self.table)
self.table.setCellWidget(row, 1, button)
button.clicked.connect(partial(self._buttonItemClicked, item))
layout = QtGui.QHBoxLayout(self)
layout.addWidget(self.table)
def _buttonItemClicked(self, item):
print "Button clicked at row", item.row()
在本例中,我们只是将第一列的项目烘焙到 clicked 回调中,因此当您单击它们时,它们有一个询问行号的参考。对于较低级别的模型/视图,该方法会有所不同。
【讨论】:
谢谢。如果you don't have any QTableWidgetItem in the row怎么办? @Jérôme,看起来您已经通过编辑获得了答案...以确保添加可以跟踪行的QTableWidgetItem
。
我还使用 QtCore.QPersistentModelIndex 得到了更好的答案。【参考方案2】:
您可能需要使用信号cellEntered
和插槽removeRow
(如果您使用的是QTableWidget
)。请参阅文档 here 了解 PySide 和 here 了解 PyQt。您可能还需要在 Qt 文档here 中查找此主题。
【讨论】:
【参考方案3】:假设删除应该发生,例如单击鼠标,所有视图都有indexAt 方法, 这会将任何光标/鼠标位置映射到模型索引:
modelIndex = myView.indexAt(cursorLocation) # where cursorLocation is a QPoint instance
这样,对模型进行更改就很简单了。
另外,类似于 doru 的回答,视图也实现了entered
信号等,通知您鼠标在某个模型索引上的操作:
http://qt-project.org/doc/qt-4.8/qabstractitemview.html#signals
【讨论】:
在我的项目中我使用了表格小部件,你能告诉我我们如何知道光标在表格小部件中闪烁的位置吗?以上是关于如何获取 QTableWidget 光标下的行的主要内容,如果未能解决你的问题,请参考以下文章
如何判断QTableWidget中的单元格是处于选中状态还是正在编辑的状态(即光标进入)?如下图: