代码之家  ›  专栏  ›  技术社区  ›  Peter

获取qtreeWidget的当前选定单元格

  •  0
  • Peter  · 技术社区  · 7 年前

    我想修改 qtreeWidget 以使选中的单元格在按Enter键时可编辑,但保持选择为整行。

    我已经完成了一个简单的实现,找出最后一次点击的位置并保存该值,然后将这些值发送到按键上的my edit_item function(也用于 itemDoubleClicked signal)。不过,这并不好,我想知道是否有一种更简单的方法可以做到。

    对于记录,单击一个项目仍然会选择整行。默认情况下,它可能是隐藏的行为,但在玛雅,有一个可见的选择对象,是在按住鼠标按钮时移动的最后一个单元格。如果我能以某种方式访问它,我还可以添加行为来用箭头键控制它。

    这是所选单元格的示例:

    这是迄今为止我的代码:

    class qtreewidget(qtwidgets.qtreewidget):
    
    返回按下=qtcore.signal(qtreeWidget,int)
    
    定义初始化(self,*args,**kwargs):
    qtwidgets.qtreewidget.\uu init\uuuuu(self,*args,**kwargs)
    
    def keypressevent(self,事件):
    如果event.key()==qtcore.qt.key_返回:
    self.returnPressed.emit(self.\u selected\项目,self.\u selected\列)
    其他:
    qtwidgets.qtreewidget.keypressevent(self,event)
    
    定义鼠标位置计算(自我,x位置):
    “查找当前选定的列。”
    尝试:
    item=self.selecteditems()[0]
    除了索引错误:
    项目=无
    
    header=self.header()。
    总宽度=0
    对于范围内的i(self.columncount()):
    总宽度+=标题。节大小(I)
    如果总宽度大于x位置:
    返回(项,i)
    
    def mousepressevent(self,事件):
    qtWidgets.qtreeWidget.mousePressEvent(self,event)
    self._selected_item,self._selected_column=self._mouse_pos_calculate(event.pos().x())
    
    def mousereleaseevent(self,事件):
    qtWidgets.qtreeWidget.mouseReleaseEvent(self,event)
    self._selected_item,self._selected_column=self._mouse_pos_calculate(event.pos().x())
    < /代码> 
    
    

    编辑:由于Eyllanesc改进了功能

    class qtreewidget(qtwidgets.qtreewidget):
    “按回车键时添加编辑单元格的功能。”
    itemedit=qtcore.signal(qtwidgets.qtreewidgetitem,int)
    
    定义初始化(self,*args,**kwargs):
    qtwidgets.qtreewidget.\uu init\uuuuu(self,*args,**kwargs)
    
    self.\u last\u item=无
    self.\u最后一列=0
    self.itemDoubleClicked.connect(self._编辑_item_拦截)
    
    def _edit_item_intercept(self,item=none,column=none):
    
    
    edit_itemitemDoubleClicked

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   eyllanesc    7 年前

    你做了很多不必要的计算,在下一部分我将展示一个更清晰的解决方案:

    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())
    
    推荐文章