如何获取 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

Qt 学习笔记 10.QTableWidget

如何判断QTableWidget中的单元格是处于选中状态还是正在编辑的状态(即光标进入)?如下图:

Qt C++ - 删除 QTableWidget 中的行

如何在 QTableWidget 中仅获取包含值的行/列数?

qt中如何判断光标在哪个文本框中啊