2016-05-27 3 views
0

enter image description hereКак сделать QTreeWIdgetItems редактируемые выборочно

Все клетки в настоящее время доступны для редактирования (редактируемые на двойной щелчок). Мне нужен только столбец 0 для редактирования, а все остальные нет. Как это достичь?

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

class Tree(QtGui.QTreeWidget): 
    def __init__(self, *args, **kwargs): 
     super(Tree, self).__init__() 
     for i, item_name in enumerate(['Item_1','Item_2','Item_3','Item_4','Item_5']): 
      rootItem = QtGui.QTreeWidgetItem() 
      rootItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable) 
      for n in range(7): 
       rootItem.setText(n, 'Root %s row %s'%(i, n) ) 

      rootItem.sceneSG={} 
      rootItem.sceneSG['code']='nextSceneFilename' 

      for number in range(5): 
       childItem = QtGui.QTreeWidgetItem(rootItem) 
       childItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable) 
       childItem.sceneSG={}  
       for m in range(7): 
        childItem.setText(m, 'Child %s row %s'%(number, m) ) 

      rootItem.setData(100, 77, QtCore.Qt.UserRole) 

      self.addTopLevelItem(rootItem) 

     self.setColumnCount(5) 
     self.resize(360,240) 
     self.show() 

tree=Tree() 
app.exec_() 
+0

Смотрите здесь: http://stackoverflow.com/questions/2801959/making-only-one-column-of-a-qtreewidgetitem-editable Второй ответ. Тем не менее, я немного не уверен в предоставлении ответа на Python. – AlexanderVX

ответ

1

Вообще, вы могли бы сделать это с использованием QItemDelegate. Делегаты дают вам контроль над тем, как данные из модели отображаются в представлении и как данные из контроллера/вида редактируются и вставляются обратно в модель. Они позволяют делать такие вещи, как обычная роспись и пользовательские редакторы. В этом случае мы просто проверяем индекс столбца и отказываемся возвращать редактор для чего угодно, кроме первого столбца.

class MyDelegate(QtGui.QItemDelegate): 

    def createEditor(self, parent, option, index): 
     if index.column() == 0: 
      return super(MyDelegate, self).createEditor(parent, option, index) 
     return None 


delegate = MyDelegate() 
tree.setItemDelegate(delegate) 
0

Для простоты я использую doubleClick сигнал treeWidget, что обрабатывается, прежде чем вещи добраться до setData метода QTreeWidgetItem в. Так как метод onDoubleClick получает индекс, мы можем установить элемент как редактируемый или нет как редактируемый заранее. Рабочий раствор размещен ниже:

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

class Tree(QtGui.QTreeWidget): 
    def __init__(self, *args, **kwargs): 
     super(Tree, self).__init__() 
     for i, item_name in enumerate(['Item_1','Item_2','Item_3','Item_4','Item_5']): 
      rootItem = QtGui.QTreeWidgetItem() 
      rootItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable) 
      for n in range(7): 
       rootItem.setText(n, 'Root %s row %s'%(i, n) ) 

      rootItem.sceneSG={} 
      rootItem.sceneSG['code']='nextSceneFilename' 

      for number in range(5): 
       childItem = QtGui.QTreeWidgetItem(rootItem) 
       childItem.setFlags(rootItem.flags() | QtCore.Qt.ItemIsEditable) 
       childItem.sceneSG={}  
       for m in range(7): 
        childItem.setText(m, 'Child %s row %s'%(number, m) ) 

      rootItem.setData(100, 77, QtCore.Qt.UserRole) 

      self.addTopLevelItem(rootItem) 

     self.setColumnCount(5) 
     self.doubleClicked.connect(self.onDoubleClick) 
     self.show() 

    def onDoubleClick(self, index): 
     item = self.currentItem() 
     item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) 
     if index.column()!=0: 
      item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable) 

tree=Tree() 
app.exec_() 
Смежные вопросы