Как редактировать только один столбец QTreeWidgetItem

Я хотел бы знать, как редактировать только один столбец QTreeWidgetItem.

В настоящее время я могу редактировать все столбцы 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_())

ИЗМЕНИТЬ

Я добавил некоторые изменения, но не знаю, как редактировать второй столбец моего 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_())

person Vincent    schedule 03.07.2015    source источник
comment
Связано: stackoverflow.com/q/2801959/1994235   -  person three_pineapples    schedule 03.07.2015


Ответы (2)


Нет никаких методов/флагов, чтобы настроить это напрямую.

Вы можете решить эту проблему, полностью отключив Qt EditTriggers и реализовав собственную функцию, которая решает, следует ли редактировать элемент или нет:

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)

Если вы хотите редактировать и в других случаях, просто подключите checkEdit к соответствующим сигналам, таким как itemClicked, itemEntered и т. д.

person sebastian    schedule 03.07.2015
comment
Спасибо, но это не работает полностью. Когда я нажимаю на вторую строку, это позволяет редактировать первую строку. Я думаю, что мне следует поместить столбец, который я хочу изменить, в параметры editItem(), но я не знаю, как получить доступ к "i", например, в barA. Я отредактировал свой пост с новым фрагментом кода. - person Vincent; 03.07.2015
comment
Вы также можете заменить = на == в условии. Это тривиально, но я не могу отредактировать ваш пост на один символ. - person Vincent; 03.07.2015

Попробуйте это, это работа для меня.

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)
person EEEEH    schedule 03.09.2019