簡體   English   中英

獲取當前選擇的QTreeWidget單元格

[英]Get currently selected cell of QTreeWidget

我想修改QTreeWidget使其在按下回車鍵時可編輯所選單元格,但將選擇保留為全行。

我已經完成了一個怪誕的實現,弄清楚最后一次單擊的位置並保存該值,然后將這些值發送到edit_item上的edit_item函數中(也用於itemDoubleClicked信號)。 但這不是很好,我想知道是否有更簡單的方法來做到這一點。

作為記錄,單擊一個項目仍會選擇整行。 默認情況下,它可能是隱藏的行為,但是在Maya中,按住鼠標按鈕時,有一個可見的最后一個單元格被選中。 如果可以某種方式訪問​​它,我還可以添加行為以使用箭頭鍵控制它。

這是所選單元格的一個示例:

在此處輸入圖片說明

到目前為止,這是我的代碼:

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())

您不必要地進行了大量計算,在下一部分中,我展示了一種更簡潔的解決方案:

from PySide2 import QtCore, QtGui, QtWidgets


class QTreeWidget(QtWidgets.QTreeWidget):
    def __init__(self, *args, **kwargs):
        super(TreeWidget, self).__init__(*args, **kwargs)
        self.special_item = None
        self.special_col = 0

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Return:
            self.editItem(self.special_item, self.special_col)
        QtWidgets.QTreeWidget.keyPressEvent(self, event)

    def editEnable(self, pos):
        press_item = self.itemAt(pos)
        if press_item is None:
            return
        if press_item is self.selectedItems()[0]:
            col = self.header().logicalIndexAt(pos.x())
            self.special_item = press_item
            self.special_col = col

    def mousePressEvent(self, event):
        QtWidgets.QTreeWidget.mousePressEvent(self, event)
        self.editEnable(event.pos())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM