【发布时间】:2014-07-09 09:11:54
【问题描述】:
有没有办法获取鼠标指针下的行号?我想在不知道行号的情况下删除一行,而只使用光标位置。
编辑:
在此图像中,您可以为资源库添加项目。 单击删除箱时,应删除该行。最好的方法是在单击 bin 时查询鼠标指针下的 ROW 编号。其中行号被解析为 removeRow 函数。 我不知道如何使用 QPointer。并且 cellEntered 需要在添加或删除新行时不会保持不变的行/列值。
【问题讨论】:
有没有办法获取鼠标指针下的行号?我想在不知道行号的情况下删除一行,而只使用光标位置。
编辑:
在此图像中,您可以为资源库添加项目。 单击删除箱时,应删除该行。最好的方法是在单击 bin 时查询鼠标指针下的 ROW 编号。其中行号被解析为 removeRow 函数。 我不知道如何使用 QPointer。并且 cellEntered 需要在添加或删除新行时不会保持不变的行/列值。
【问题讨论】:
有许多方法可以解决这个问题。有些可能涉及光标位置,有些可能涉及表事件和信号。使用 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 回调中,因此当您单击它们时,它们有一个询问行号的参考。对于较低级别的模型/视图,该方法会有所不同。
【讨论】:
QTableWidgetItem。
假设删除应该发生,例如单击鼠标,所有视图都有indexAt 方法, 这会将任何光标/鼠标位置映射到模型索引:
modelIndex = myView.indexAt(cursorLocation) # where cursorLocation is a QPoint instance
这样,对模型进行更改就很简单了。
另外,类似于 doru 的回答,视图也实现了entered 信号等,通知您鼠标在某个模型索引上的操作:
http://qt-project.org/doc/qt-4.8/qabstractitemview.html#signals
【讨论】: