Vincent
Vincent

Reputation: 113

How to edit only one column of a QTreeWidgetItem

I would like to know how to edit only one column of a QTreeWidgetItem.

Currently, I can edit all columns of a QTreeWidgetItem.

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

app = QApplication(sys.argv)
qApp = app

pointListBox = QTreeWidget()

header=QTreeWidgetItem(["Tree","First","secondo"])

pointListBox.setHeaderItem(header)   

root = QTreeWidgetItem(pointListBox, ["root"])
A = QTreeWidgetItem(root, ["A"])
barA = QTreeWidgetItem(A, ["bar", "i", "ii"])
bazA = QTreeWidgetItem(A, ["baz", "a", "b"])

barA.setFlags(barA.flags() | Qt.ItemIsEditable)
bazA.setFlags(bazA.flags() | Qt.ItemIsEditable)

pointListBox.show()
sys.exit(app.exec_())

EDIT

I have added some changes but I don't know how to edit the second column of my QtreeWidgetItem.

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

class MainWindow(QMainWindow):

    def __init__(self,  parent=None):
        super(MainWindow,self).__init__(parent)

        self.initUI()

    def createGroup(self):
         groupBox = QGroupBox()

        self.treeWidget = QTreeWidget()

        header=QTreeWidgetItem(["Tree","First","secondo"])
        #...
        self.treeWidget.setHeaderItem(header)   #Another alternative is setHeaderLabels(["Tree","First",...])

        root = QTreeWidgetItem(self.treeWidget, ["root"])
        A = QTreeWidgetItem(root, ["A"])
        barA = QTreeWidgetItem(A, ["bar", "i", "ii"])
        bazA = QTreeWidgetItem(A, ["baz", "a", "b"])

        barA.setFlags(barA.flags() | Qt.ItemIsEditable)
        bazA.setFlags(bazA.flags() | Qt.ItemIsEditable)

    # switch off "default" editing behaviour
    # as it does not allow to configure only an individual
    # column as editable
        self.treeWidget.setEditTriggers(self.treeWidget.NoEditTriggers)

    # to be able to decide on your own whether a particular item
    # can be edited, connect e.g. to itemDoubleClicked
        self.treeWidget.itemDoubleClicked.connect(self.checkEdit)


        vbox = QVBoxLayout()
        vbox.addWidget(self.treeWidget)

        vbox.addStretch(1)
        groupBox.setLayout(vbox)

        return groupBox

# in your connected slot, you can implement any edit-or-not-logic
# you want
    def checkEdit(self, item, column):
        # e.g. to allow editing only of column 1:
        if column == 1:
            self.treeWidget.editItem(item[1])

    def initUI(self):
        self.resize(300, 220)

        self.grid = QGridLayout()

        self.widget = QWidget()
        self.widget.setLayout(self.grid)
        self.setCentralWidget(self.widget)
        self.grid.addWidget(self.createGroup(),1,0,1,2)

        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create("Fusion"))
    form = MainWindow()
    form.show()
    sys.exit(app.exec_())

Upvotes: 0

Views: 4569

Answers (2)

EEEEH
EEEEH

Reputation: 779

Try this, it's work for me.

self.treeWidget.itemDoubleClicked.connect(self.checkEdit)  
def checkEdit(self, item, column):

   tmp = item.flags()

   if column == 1 :
      item.setFlags(tmp | QtCore.Qt.ItemIsEditable)
   elif tmp & QtCore.Qt.ItemIsEditable:
      item.setFlags(tmp ^ QtCore.Qt.ItemIsEditable)

Upvotes: 2

sebastian
sebastian

Reputation: 9696

There are no methods / flags to configure this directly.

You can solve this by switching off Qt's EditTriggers completely and implementing your own function that decides whether an item should be edited or not:

class MyWidget(QWidget):

    def __init__(parent):

        self.treeWidget = ...

        # switch off "default" editing behaviour
        # as it does not allow to configure only an individual
        # column as editable
        self.treeWidget.setEditTriggers(self._treeWidget.NoEditTriggers)

        # to be able to decide on your own whether a particular item
        # can be edited, connect e.g. to itemDoubleClicked
        self.treeWidget.itemDoubleClicked.connect(self.checkEdit)

    # in your connected slot, you can implement any edit-or-not-logic
    # you want
    def checkEdit(self, item, column):
        # e.g. to allow editing only of column 1:
        if column == 1:
            self.treeWidget.editItem(item, column)

If you'd like to editing on other occasions as well, simply connect checkEdit to the according signals, such as itemClicked, itemEntered etc.

Upvotes: 1

Related Questions