2016-05-04 4 views
3

Я наследую от QtCore.QAbstractItemModel, показывая древовидную структуру.Как отключить строку в QTreeview?

Ниже я пытаюсь добавить функцию «включить/отключить» для каждого узла/строки.

Кто-нибудь знает, как отключить определенные строки в викторине QTreeView?

enter image description here

Чтобы быть более ясным, по «отключить», я имею в виду неактивны, еще rightclickable, видно, не редактируется, как показано на рисунке.

+0

Вы уже смотрели здесь: http://doc.qt.io/qt-4.8/qtreewidget.html упс автор, прежде чем я мог закончить .. и здесь: http://escrow.aliexpress.com : //doc.qt.io/qt-4.8/qtreewidgetitem.html Посмотрите на 'itemAt()' в 'QTreeWidget' и' setDisabled' в 'QTreeWidgetItem' –

+0

@busfault OP использует qabstractitemmodel ... Тем не менее, OP должно быть более ясным: «инвалидом» вы хотите показать, но не подбираться? Или не показывать? Включение минимального самостоятельного примера может помочь (http://stackoverflow.com/help/mcve). Хотя я думаю, что наиболее важным с этим является включение более точной спецификации того, что вы подразумеваете под «отключением». – neuronet

+0

Спасибо, ребята, за ответ! И жаль, что не ясна. Я пытался использовать иерархию для представления отношений родитель-потомок. Если я щелкнул правой кнопкой мыши на joint2, у меня есть два действия: «включить, отключить». Я нажимаю на «disable» и joint2, и его дети серые, но видимые и правые. Затем, если я нажму правой кнопкой мыши на joint2 и выберите «enable», joint2 и его childeren станут зелеными и будут доступны для выбора/редактирования снова. – user3042801

ответ

1

Переопределите метод flags вашего QAbstractItemModel потомок. Что-то вроде этого:

def flags(self, index): 

    if not index.isValid(): 
     return 0 

    # Disable even rows, enable odd rows 
    if index.row() % 2 == 0: 
     return QtCore.Qt.NoItemFlags 
    else: 
     return QtCore.Qt.ItemIsEnabled 
0
import sys 
from PyQt4 import QtGui 
from PyQt4 import QtCore 

class TREEWIDGET (QtGui.QWidget): 

    def __init__(self): 
     super(TREEWIDGET, self).__init__()   
     self.initUI()   

    def initUI(self):   
     self.treeWidget = QtGui.QTreeWidget(self) 
     self.treeWidget.setGeometry(QtCore.QRect(10, 10, 311, 321)) 
     self.treeWidget.setObjectName('treeWidget') 
     self.treeWidget.setSelectionMode (QtGui.QAbstractItemView.ExtendedSelection) 

     self.button_disable = QtGui.QPushButton(self) 
     self.button_disable.setGeometry(QtCore.QRect(20, 340, 121, 23)) 
     self.button_disable.setObjectName('pushButton') 
     self.button_disable.setText ('Disable') 

     self.button_enable = QtGui.QPushButton(self) 
     self.button_enable.setGeometry(QtCore.QRect(160, 340, 111, 23)) 
     self.button_enable.setObjectName('pushButton') 
     self.button_enable.setText ('Ensable All') 

     self.button_disable.clicked.connect (self.disable) 
     self.button_enable.clicked.connect (self.enable) 

     self.resize(350, 400) 
     self.addItems() 
     self.show()   

    def addItems (self) : 
     parentA = QtGui.QTreeWidgetItem (self.treeWidget) 
     parentA.setText (0, 'Joint1') 
     parentA.setExpanded (1)  
     cParentA = parentA   
     for loop in range (2, 6) : 
      childA = QtGui.QTreeWidgetItem (cParentA) 
      childA.setText (0, 'Joint' + str(loop)) 
      childA.setExpanded (1) 
      cParentA  = childA 

     parentB = QtGui.QTreeWidgetItem (self.treeWidget) 
     parentB.setText (0, 'Joint_1') 
     parentB.setExpanded (1)  
     cParentB  = parentB   
     for loop in range (2, 6) : 
      childB = QtGui.QTreeWidgetItem (cParentB) 
      childB.setText (0, 'Joint_' + str(loop)) 
      childB.setExpanded (1) 
      cParentB  = childB   

    def disable (self) :   
     selectedItem = self.treeWidget.selectedItems() 
     for eachItem in selectedItem : 
      eachItem.setDisabled (1)    
      eachItem.setSelected (0)  

    def enable (self) : 
     self.allItemElements = [] 
     widget    = self.treeWidget.invisibleRootItem() 
     existsItems   = self.collectItems (widget)   
     if existsItems : 
      for eachItem in existsItems : 
       eachItem.setDisabled (0)   

    def collectItems (self, widget) :    
     itemCount   = widget.childCount()  
     for itLoop in range (0, itemCount, 1) : 
      self.allItemElements.append (widget.child(itLoop)) 
      self.collectItems (widget.child(itLoop))      
     return self.allItemElements 
+0

Субин, спасибо за ваш ответ! :) – user3042801

+0

Субин, спасибо за ваш ответ! :) Одна вещь, которая отличается от моего первоначального мышления, заключается в том, что я использую QTreeView, а ваш код использует QTreeWidget. Я пытаюсь добиться того, что делает ваш метод disable(), но с помощью QTreeView для отображения. Вот как я получаю предмет. item = self.window.treeView.selectedIndexes() [0] .internalPointer(). и QModelIndex() не имеет функции setDisable(). – user3042801

+0

дай мне время, я тебе поможем. –

2

Это отключает строки со всеми детьми (в отличие от другого ответа).

import sys 
from PyQt4 import QtGui 
from PyQt4 import QtCore 

class TREEWIDGET (QtGui.QWidget): 

    def __init__(self): 
     super(TREEWIDGET, self).__init__()   
     self.initUI()   

    def initUI(self):   
     self.treeWidget = QtGui.QTreeWidget(self) 
     self.treeWidget.setGeometry(QtCore.QRect(10, 10, 311, 321)) 
     self.treeWidget.setObjectName('treeWidget') 
     self.treeWidget.setSelectionMode (QtGui.QAbstractItemView.ExtendedSelection) 

     self.button_disable = QtGui.QPushButton(self) 
     self.button_disable.setGeometry(QtCore.QRect(20, 340, 121, 23)) 
     self.button_disable.setObjectName('pushButton') 
     self.button_disable.setText ('Disable') 

     self.button_enable = QtGui.QPushButton(self) 
     self.button_enable.setGeometry(QtCore.QRect(160, 340, 111, 23)) 
     self.button_enable.setObjectName('pushButton') 
     self.button_enable.setText ('Ensable All') 

     self.button_disable.clicked.connect (self.disable) 
     self.button_enable.clicked.connect (self.enable) 

     self.resize(350, 400) 
     self.addItems() 
     self.show()   

    def addItems (self) : 
     parentA = QtGui.QTreeWidgetItem (self.treeWidget) 
     parentA.setText (0, 'Joint1') 
     parentA.setExpanded (1)  
     cParentA = parentA   
     for loop in range (2, 6) : 
      childA = QtGui.QTreeWidgetItem (cParentA) 
      childA.setText (0, 'Joint' + str(loop)) 
      childA.setExpanded (1) 
      cParentA  = childA 

     parentB = QtGui.QTreeWidgetItem (self.treeWidget) 
     parentB.setText (0, 'Joint_1') 
     parentB.setExpanded (1)  
     cParentB  = parentB   
     for loop in range (2, 6) : 
      childB = QtGui.QTreeWidgetItem (cParentB) 
      childB.setText (0, 'Joint_' + str(loop)) 
      childB.setExpanded (1) 
      cParentB  = childB   

    def disable (self) :   
     selectedItem = self.treeWidget.selectedItems() 
     for eachItem in selectedItem : 
      eachItem.setDisabled (1)    
      eachItem.setSelected (0)  

    def enable (self) : 
     self.allItemElements = [] 
     widget    = self.treeWidget.invisibleRootItem() 
     existsItems   = self.collectItems (widget)   
     if existsItems : 
      for eachItem in existsItems : 
       eachItem.setDisabled (0)   

    def collectItems (self, widget) :    
     itemCount   = widget.childCount()  
     for itLoop in range (0, itemCount, 1) : 
      self.allItemElements.append (widget.child(itLoop)) 
      self.collectItems (widget.child(itLoop))      
     return self.allItemElements 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = TREEWIDGET() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Как это отличается от другого ответа, который вы опубликовали? не уверен, почему у вас есть два ответа Subin ... – neuronet

+0

В первом коде последние несколько строк отсутствуют, поэтому я снова отправил их. Не отличается от другого. если вы проверите оба вместе, вы сможете понять. Во втором коде я добавляю код ниже. Защиту основной(): приложение = QtGui.QApplication (sys.argv) ех = TREEWIDGET() sys.exit (app.exec_()) если __name__ == '__main__': основной() –

+1

Вы должны просто удалить ответ с ошибкой. В будущем просто отредактируйте свой ответ, чтобы исправить его, не вводите новый ответ. Это красота переполнения стека! то, что мы хотим, это единый ответ с полным решением ...Можете ли вы отредактировать один из своих ответов, чтобы сделать это, а затем удалить другой ответ, пожалуйста? – neuronet

3

Вместо QTreeWidget Я использовал treeView.

Мой код:

import sys 
from PyQt4 import QtGui 
from PyQt4 import QtCore 

class TREEWIDGET (QtGui.QWidget): 

def __init__(self): 
    super(TREEWIDGET, self).__init__()   
    self.initUI()   

def initUI(self): 

    self.treeView = QtGui.QTreeView (self) 
    self.treeView.setGeometry(QtCore.QRect(10, 10, 311, 321)) 
    self.treeView.setObjectName('treeWidget') 

    self.model = QtGui.QStandardItemModel() 
    self.addItems(self.model) 
    self.treeView.setModel(self.model) 
    self.treeView.expandAll() 
    self.treeView.setSelectionMode (QtGui.QAbstractItemView.ExtendedSelection) 

    self.button_disable = QtGui.QPushButton(self) 
    self.button_disable.setGeometry(QtCore.QRect(20, 340, 121, 23)) 
    self.button_disable.setObjectName('pushButton') 
    self.button_disable.setText ('Disable') 

    self.button_enable = QtGui.QPushButton(self) 
    self.button_enable.setGeometry(QtCore.QRect(160, 340, 111, 23)) 
    self.button_enable.setObjectName('pushButton') 
    self.button_enable.setText ('Ensable All') 

    self.button_disable.clicked.connect (self.disable) 
    self.button_enable.clicked.connect (self.enable) 


    self.resize(350, 400) 
    #self.addItems() 
    self.show()    

def addItems (self, parentWidget) : 
    rootA  = QtGui.QStandardItem ('Joint1') 
    parentWidget.appendRow (rootA)   
    cParent  = rootA  

    for loop in range (2, 6) : 
     child = QtGui.QStandardItem ('Joint' + str(loop)) 
     cParent.appendRow (child)   
     cParent  = child 

    rootB  = QtGui.QStandardItem ('Joint_1') 
    parentWidget.appendRow (rootB)   
    cParent  = rootB  

    for loop in range (2, 6) : 
     child = QtGui.QStandardItem ('Joint_' + str(loop)) 
     cParent.appendRow (child)   
     cParent  = child 


def disable (self) :   
    selectedItem = self.treeView.selectedIndexes ()   
    for eachItem in selectedItem : 
     print eachItem 
     currentItem  = eachItem.model().itemFromIndex(eachItem) 
     currentItem.setEnabled(0) 

def enable (self) : 
    self.allItemElements = [] 
    model   = self.treeView.model()   
    widget   = model.invisibleRootItem()   
    existsItems  = self.collectItems (widget) 

    for eachItem in existsItems : 
     eachItem.setEnabled(1) 


def collectItems (self, widget) : 
    itemCount = widget.rowCount()   
    for itLoop in range (0, itemCount, 1) :    
     self.allItemElements.append (widget.child(itLoop)) 
     self.collectItems (widget.child(itLoop))      
    return self.allItemElements 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = TREEWIDGET() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Привет, Субин. Еще раз спасибо за вашу помощь! Это очень близко к тому, что мне нужно! Однако, как только я отключу элемент, моя функция щелчка правой кнопкой мыши не может быть запущена на этом элементе. Но тем не менее, я новичок в древовидной структуре и благодарю вас за то, что поделился своими знаниями со мной! – user3042801