2016-05-04 15 views
3

私はQtCore.QAbstractItemModelから継承しており、ツリー構造を表示しています。QTreeviewで行を無効にする方法は?

以下、各ノード/行に「有効/無効」機能を追加しようとしています。

QTreeViewウィジェットで特定のを無効にする方法を知っている人はいませんか?

enter image description here

より明確にするためには画像に示すように、「無効化」によって、私は意味し、編集できない、目に見える、まだrightclickable、グレーアウト。

+0

はすでにここに見たことが:http://doc.qt.io/qt-4.8/qtreewidget.html私はここ..終えるとできる前に掲示 おっと:HTTP ://doc.qt.io/qt-4.8/qtreewidgetitem.html 'QTreeWidget'の' itemTreeWidget'の 'itemAt()'と 'QTreeWidgetItem'の' setDisabled'を見てください –

+0

@busfault OPはqabstractitemmodelを使っています...それはOPより明確にする必要があります: '身体障害者'によって、あなたは表示することを意味しますが、選択することはできませんか?または表示されませんか?最小限の自己完結型の例を含めると役立ちます(http://stackoverflow.com/help/mcve)。私はこれで最も重要だと思うのは、あなたが「障害者」の意味をより正確に指定することです。 – neuronet

+0

返信いただきありがとうございます!そして、明らかではないことを申し訳なく思う。親子関係を表すために階層を使用しようとしていました。私がjoint2を右クリックすると、2つのアクション "enable、disable"があります。私は "無効"をクリックし、joint2とその子はグレー表示されていますが、表示され、右クリック可能です。次に、joint2を右クリックして「有効」を選択すると、joint2とその子要素が緑色で選択可能/編集可能になります。 – user3042801

答えて

1

QAbstractItemModel子孫のflagsメソッドをオーバーライドします。このような何か:

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、ありがとうございました! :) – user3042801

+0

Subin、ありがとうございました! :)私の元の考え方とは違ったことは、私がQTreeViewを使っていて、あなたのコードがQTreeWidgetを使っていることです。私はあなたのdisable()メソッドが何を達成しようとしていますが、QTreeViewを使って表示しています。これがアイテムの入手方法です。 item = self.window.treeView.selectedIndexes()[0] .internalPointer()。 QModelIndex()にはsetDisable()funcがありません。 – 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

これは投稿した他の回答とどのように違いますか?なぜあなたは2つの答えを持っているのかわからない。Subin ... – neuronet

+0

最初のコードの最後にいくつかの行が見つからない、なぜかもう一度投稿した。 違いはありません。あなたが両方を一緒にチェックすれば、わかることができます。 2番目のコードでは、私はコードの下に追加します。 DEFメイン(): アプリ= QtGui.QApplication(sys.argvの) EX = TREEWIDGET() sys.exit(app.exec_()) __name__ == '__main__' であれば: メイン() –

+1

あなたは誤って答えを削除するだけです。将来的には、あなたの答えを編集して修正してください。新しい答えは入れないでください。それはスタックのオーバーフローの美しさです!私たちが望むのは、完全なソリューションを備えた単一の答えです...あなたはあなたの答えの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

こんにちは、スビン。もう一度あなたの助けをありがとう!それは私が必要とするものに非常に近いです!ただし、アイテムを無効にすると、そのアイテムで右クリック機能を起動できなくなりました。しかし、まだ、私はtreeviewsには新しく、あなたと私の知識を共有してくれてありがとう! – user3042801

関連する問題