PyQt treeview在doubleclick上编辑文本

时间:2015-10-17 16:49:18

标签: python pyqt5

所以我一直在尝试实现一个根据用户输入显示目录和文件的正确TreeView - 我允许用户将目录和文件添加到他的"项目"无论是递归还是其他方式,之后我都会创建自己的项目内容树视图。

现在,我的问题是,尽管我在这个主题上发现的大多数文档和其他问题似乎都想要禁用treeview项目的可编辑性,但我正在尝试(并且失败)找到一种方法启用它。我想要的是用户能够双击我的树视图的任何列中的任何单元格,然后编辑其内容。有谁知道怎么做?

下面是我用来在tabView Widget中生成一个标签的代码,之后我再添加TreeView。稍后通过AddParent和AddChild方法添加TreeView的项目。

class treeTab(QtWidgets.QWidget):
def __init__(self,core,main,label):
    super (treeTab,self).__init__()
    self.label = label
    self.core = core

    self.sizes = core.UISizes

    self.tab_sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,QtWidgets.QSizePolicy.Expanding)

    self.tree = QtWidgets.QTreeWidget(self)
    self.tree.setColumnCount(len(self.sizes.projectTreeColumnLabels))
    self.tree.setHeaderLabels(self.sizes.projectTreeColumnLabels)
    self.tree.setSizePolicy(self.tab_sizePolicy)
    self.tree_layout = QtWidgets.QGridLayout()
    self.tree_layout.objectName = self.label + "TreeGridLayout"
    self.tree.setLayout(self.tree_layout)
    self.treeroot = self.tree.invisibleRootItem()
    self.tree.setSelectionMode(Qt.QAbstractItemView.ContiguousSelection)

def addParent(self, parent, column, title, data):
    item = QtWidgets.QTreeWidgetItem(parent, [title])
    item.setData(column, QtCore.Qt.UserRole, data)
    item.setChildIndicatorPolicy(QtWidgets.QTreeWidgetItem.ShowIndicator)
    item.setExpanded (True)
    return item

def addChild(self, parent, column, title, data):
    item = QtWidgets.QTreeWidgetItem(parent, [title])
    item.setData(column, QtCore.Qt.UserRole, data)
    item.setText(1,data.print_tags())
    item.setText(2,data.category.name)
    item.setText(3,data.format)
    item.setCheckState (column, QtCore.Qt.Unchecked)
    item.setFlags(item.flags() or QtCore.Qt.ItemIsEditable)
    return item

2 个答案:

答案 0 :(得分:3)

你混淆了binary operators and Boolean operators。布尔运算符(例如andor)与布尔值(例如TrueFalse)一起使用以生成单个True或{{1一旦表达式被评估。

但是,标志而不是布尔值。它们是2的幂的整数(或只有一个位设置的二进制数),这样它们可以组合成一个整数,表示每个标志是启用还是禁用。例如,2以二进制表示为False。 4表示为0b010。如果您按位或这些在一起,则得到0b100,表示标志等于2且标志等于4。但是,未设置等于1的标志(0b110中的0)。

简而言之,您应该使用按位或运算符(0b110)设置标志:

|

答案 1 :(得分:1)

所以我设法把这个弄清楚了 - 最后结果很简单:)

为了创建一个'可编辑的'treeView项,您可以在其中双击特定项的文本进行编辑,只需将项目特定列中包含的窗口小部件更改为删除的QLineEdit窗口小部件按下回车键。其代码如下:

这是将双击事件连接到获取当前所选项目并将其替换为QLineEdit窗口小部件的方法的代码:

self.tree.itemDoubleClicked.connect(self.editItem)

def editItem(self,*args):
    itm = self.tree.itemFromIndex(self.tree.selectedIndexes()[0])
    column = self.tree.currentColumn()
    edit = QtWidgets.QLineEdit()
    edit.returnPressed.connect(lambda*_:self.project.setData(column,edit.text(),itm,column,self.tree))
    edit.returnPressed.connect(lambda*_:self.update())
    self.tree.setItemWidget(itm,column,edit)

特别注意以下代码的组合:

    itm = self.tree.itemFromIndex(self.tree.selectedIndexes()[0])
    column = self.tree.currentColumn()

此代码实际上为您提供了当前所选项目的行和列,如果您想单独编辑列项目,这将非常有用。

现在您将问自己为什么我将这么多参数传递给'setData'方法:这纯粹是出于我的特定项目的目的,所以不要担心它。 'returnPressed'事件只需要连接到正确的方法来处理它包含的任何数据,然后删除它自己。在我的代码中,这看起来像这样:

def setData(self,dataTypeIndex,data,item,column,tree):
    if dataTypeIndex == 0:
        # filename
        self.name = data
    elif dataTypeIndex == 1:
        # tags
        data = data.split(",")
        self.tags = []
        for tag in data:
            self.tags.append(Tag(tag))
    elif dataTypeIndex == 2:
        # category
        self.category.name = data

    tree.setItemWidget(item,column,None)

这最后一行代码(tree.setItemWidget(item,column,None))是QlineEdit无用的地方,因此被有效删除。