私はQtCore.QAbstractItemModel
から継承しており、ツリー構造を表示しています。QTreeviewで行を無効にする方法は?
以下、各ノード/行に「有効/無効」機能を追加しようとしています。
QTreeViewウィジェットで特定の行を無効にする方法を知っている人はいませんか?
より明確にするためには画像に示すように、「無効化」によって、私は意味し、編集できない、目に見える、まだrightclickable、グレーアウト。
私はQtCore.QAbstractItemModel
から継承しており、ツリー構造を表示しています。QTreeviewで行を無効にする方法は?
以下、各ノード/行に「有効/無効」機能を追加しようとしています。
QTreeViewウィジェットで特定の行を無効にする方法を知っている人はいませんか?
より明確にするためには画像に示すように、「無効化」によって、私は意味し、編集できない、目に見える、まだrightclickable、グレーアウト。
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
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
Subin、ありがとうございました! :) – user3042801
Subin、ありがとうございました! :)私の元の考え方とは違ったことは、私がQTreeViewを使っていて、あなたのコードがQTreeWidgetを使っていることです。私はあなたのdisable()メソッドが何を達成しようとしていますが、QTreeViewを使って表示しています。これがアイテムの入手方法です。 item = self.window.treeView.selectedIndexes()[0] .internalPointer()。 QModelIndex()にはsetDisable()funcがありません。 – user3042801
私はあなたを助ける時間を与えてください。 –
これは(他の答えは異なる)すべての子を持つ行を無効にします。
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()
これは投稿した他の回答とどのように違いますか?なぜあなたは2つの答えを持っているのかわからない。Subin ... – neuronet
最初のコードの最後にいくつかの行が見つからない、なぜかもう一度投稿した。 違いはありません。あなたが両方を一緒にチェックすれば、わかることができます。 2番目のコードでは、私はコードの下に追加します。 DEFメイン(): アプリ= QtGui.QApplication(sys.argvの) EX = TREEWIDGET() sys.exit(app.exec_()) __name__ == '__main__' であれば: メイン() –
あなたは誤って答えを削除するだけです。将来的には、あなたの答えを編集して修正してください。新しい答えは入れないでください。それはスタックのオーバーフローの美しさです!私たちが望むのは、完全なソリューションを備えた単一の答えです...あなたはあなたの答えの1つを編集して、それから他の答えを削除できますか? – neuronet
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()
こんにちは、スビン。もう一度あなたの助けをありがとう!それは私が必要とするものに非常に近いです!ただし、アイテムを無効にすると、そのアイテムで右クリック機能を起動できなくなりました。しかし、まだ、私はtreeviewsには新しく、あなたと私の知識を共有してくれてありがとう! – user3042801
はすでにここに見たことが:http://doc.qt.io/qt-4.8/qtreewidget.html私はここ..終えるとできる前に掲示 おっと:HTTP ://doc.qt.io/qt-4.8/qtreewidgetitem.html 'QTreeWidget'の' itemTreeWidget'の 'itemAt()'と 'QTreeWidgetItem'の' setDisabled'を見てください –
@busfault OPはqabstractitemmodelを使っています...それはOPより明確にする必要があります: '身体障害者'によって、あなたは表示することを意味しますが、選択することはできませんか?または表示されませんか?最小限の自己完結型の例を含めると役立ちます(http://stackoverflow.com/help/mcve)。私はこれで最も重要だと思うのは、あなたが「障害者」の意味をより正確に指定することです。 – neuronet
返信いただきありがとうございます!そして、明らかではないことを申し訳なく思う。親子関係を表すために階層を使用しようとしていました。私がjoint2を右クリックすると、2つのアクション "enable、disable"があります。私は "無効"をクリックし、joint2とその子はグレー表示されていますが、表示され、右クリック可能です。次に、joint2を右クリックして「有効」を選択すると、joint2とその子要素が緑色で選択可能/編集可能になります。 – user3042801