2016-05-04 3 views
3

Ich erben von QtCore.QAbstractItemModel, zeigt eine Baumstruktur.Wie kann ich eine Zeile in QTreeview deaktivieren?

Im Folgenden versuche ich eine "aktivieren/deaktivieren" -Funktion für jeden Knoten/Zeile hinzuzufügen.

Kann jemand bestimmte Zeilen in einem QTreeView Widget deaktivieren?

enter image description here

Um mehr klar, von "disable" zu sein, ich meinen abgeblendet, noch rightclickable, sichtbar, nicht bearbeitet werden, wie in der Abbildung dargestellt.

+0

Haben Sie schon hier sah: http://doc.qt.io/qt-4.8/qtreewidget.html oops, dass geschrieben, bevor ich .. und hier zu Ende bringen konnte: http : //doc.qt.io/qt-4.8/qtreewidgetitem.html Blick auf 'itemAt()' in 'QTreeWidget' und' setDisabled' in 'QTreeWidgetItem' –

+0

@busfault OP verwendet qabstractitemmodel ... Das heißt, OP sollte klarer sein: mit "behindert" meinst du zeigen, aber nicht wählbar sein? Oder nicht zeigen? Ein kleines, eigenständiges Beispiel könnte helfen (http://stackoverflow.com/help/mcve). Obwohl ich denke, dass das wichtigste hier ist, ist eine präzisere Beschreibung dessen, was Sie unter "behindert" verstehen. – neuronet

+0

Danke Jungs für die Antwort! Und tut mir leid, dass ich nicht klar bin. Ich habe versucht, die Hierarchie zu verwenden, um eine Eltern-Kind-Beziehung darzustellen. Wenn ich mit der rechten Maustaste auf joint2 klicke, habe ich zwei Aktionen "enable, disable". Ich klicke auf "disable" und joint2 und seine Kinder sind ausgegraut, aber sichtbar und rechtsklickbar. Wenn ich dann rechts auf joint2 klicke und "enable" wähle, sind joint2 und seine Kinder grün und können wieder ausgewählt/editiert werden. – user3042801

Antwort

1

Überschreiben Sie die flags Methode Ihres QAbstractItemModel Nachkommens. Etwas wie folgt aus:

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

Subin, danke für Ihre Antwort! :) – user3042801

+0

Subin, danke für Ihre Antwort! :) Eine Sache, die sich von meinem ursprünglichen Denken unterscheidet, ist, dass ich QTreeView verwende und dein Code QTreeWidget benutzt. Ich versuche zu erreichen, was Ihre disable() -Methode tut, aber mit QTreeView anzuzeigen. So bekomme ich den Gegenstand. item = self.window.treeView.selectedIndexes() [0] .internalPointer(). und QModelIndex() hat keine Funktion setDisable(). – user3042801

+0

gib mir Zeit ich werde dir helfen. –

2

Dies deaktiviert Zeilen mit allen Kindern (anders als die anderen Antwort).

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

Wie unterscheidet sich das von der anderen Antwort, die Sie gepostet haben? nicht sicher, warum Sie zwei Antworten haben Subin ... – neuronet

+0

Im ersten Code letzten fehlen einige Zeilen, deshalb habe ich noch einmal gepostet. Es ist nicht anders als die anderen. Wenn Sie beide zusammen überprüfen können Sie verstehen. Im zweiten Code füge ich den folgenden Code an. def main(): app = QtGui.QApplication (sys.argv) ex = TREEWIDGET() sys.exit (app.exec_()) wenn __name__ == '__main__': main() –

+1

Sie sollten dann einfach die Antwort mit dem Fehler löschen. Bearbeiten Sie in Zukunft einfach Ihre Antwort, um sie zu korrigieren. Legen Sie keine neue Antwort an. Das ist die Schönheit des Stapelüberlaufs! Was wir wollen, ist eine einzige Antwort mit einer vollständigen Lösung ...Können Sie eine Ihrer Antworten bearbeiten, um dies zu tun, und dann die andere Antwort löschen? – neuronet

3

Anstelle von QTreeWidget habe ich einen TreeView verwendet.

Mein Code:

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

Hallo, Subin. Vielen Dank für Ihre Hilfe! Es ist sehr nah an dem, was ich brauche !! Sobald ich jedoch ein Element deaktiviere, konnte meine Rechtsklick-Funktion für dieses Objekt nicht mehr ausgelöst werden. Aber ich bin immer noch neu bei Baumansichten und danke, dass du dein Wissen mit mir geteilt hast! – user3042801