获取当前选择的QTreeWidget单元格

时间:2018-08-01 14:50:41

标签: python qtreewidget pyside2

我想修改QTreeWidget,以便在按下Enter键时使选定的单元格可编辑,但将选择保留为全行。

我已经完成了一个怪诞的实现,弄清楚最后一次点击的位置并保存该值,然后将这些值发送到我的edit_item函数上(也用于itemDoubleClicked信号)。但这不是很好,我想知道是否有更简单的方法来做到这一点。

作为记录,单击一个项目仍会选择整行。默认情况下,它可能是隐藏的行为,但是在Maya中,按住鼠标按钮时,有一个可见的最后一个单元格被选中。如果可以某种方式访问​​它,我还可以添加行为以使用箭头键进行控制。

这是所选单元格的一个示例:

enter image description here

到目前为止,这是我的代码:

class QTreeWidget(QtWidgets.QTreeWidget):

    returnPressed = QtCore.Signal(QTreeWidget, int)

    def __init__(self,  *args, **kwargs):
        QtWidgets.QTreeWidget.__init__(self, *args, **kwargs)

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Return:
            self.returnPressed.emit(self._selected_item, self._selected_column)
        else:
            QtWidgets.QTreeWidget.keyPressEvent(self, event)

    def _mouse_pos_calculate(self, x_pos):
        """Find the currently selected column."""
        try:
            item = self.selectedItems()[0]
        except IndexError:
            item = None

        header = self.header()
        total_width = 0
        for i in range(self.columnCount()):
            total_width += header.sectionSize(i)
            if total_width > x_pos:
                return (item, i)

    def mousePressEvent(self, event):
        QtWidgets.QTreeWidget.mousePressEvent(self, event)
        self._selected_item, self._selected_column = self._mouse_pos_calculate(event.pos().x())

    def mouseReleaseEvent(self, event):
        QtWidgets.QTreeWidget.mouseReleaseEvent(self, event)
        self._selected_item, self._selected_column = self._mouse_pos_calculate(event.pos().x())

编辑:通过eyllanesc改进了功能

class QTreeWidget(QtWidgets.QTreeWidget):
    """Add ability to edit cells when pressing return."""
    itemEdit = QtCore.Signal(QtWidgets.QTreeWidgetItem, int)

    def __init__(self,  *args, **kwargs):
        QtWidgets.QTreeWidget.__init__(self, *args, **kwargs)

        self._last_item = None
        self._last_column = 0
        self.itemDoubleClicked.connect(self._edit_item_intercept)

    def _edit_item_intercept(self, item=None, column=None):
        if item is None:
            item = self._last_item
        if column is None:
            column = self._last_column
        self.itemEdit.emit(item, column)

    def _store_last_cell(self, pos):
        selected_item = self.itemAt(pos)
        if selected_item is None:
            return
        self._last_item = selected_item
        self._last_column = self.header().logicalIndexAt(pos.x())

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Return:
            return self._edit_item_intercept()
        QtWidgets.QTreeWidget.keyPressEvent(self, event)

    def mouseMoveEvent(self, event):
        QtWidgets.QTreeWidget.mouseMoveEvent(self, event)
        self._store_last_cell(event.pos())

1 个答案:

答案 0 :(得分:1)

您不必要地进行了大量计算,在下一部分中,我展示了一种更简洁的解决方案:

central-featured-lang lang1