7

基本的に、ユーザーがデータのさまざまな内訳を表示し、特定のアイテムを削除するオプションを使用できるようにするツリー ウィジェットを作成しようとしています。これを行うには、各トップ レベル アイテムと各子にチェック ボックスを関連付けて、ユーザーが削除するトップ レベル アイテム (およびそのトップ レベル アイテムのすべての子) を選択できるようにします。または、削除する特定の子。より良いアイデアを提供するために、[x] がチェックされたチェックボックスを表し、[ ] が空のチェックボックスを表す例を作成しました。

>Beverages Allowed in Stadium [ ]
    Soda                      [ ]
    Water                     [ ]
    Tea                       [ ]
    Spirits                   [X]
    Ale                       [ ]

>Tickets                      [X]
    Row A                     [X]
    Row B                     [X]
    Row C                     [X]
    Lawn                      [X]

これを実装する方法について何か提案はありますか? 難易度に違いがあるかどうかはわかりませんが、チェックボックスに別の列を割り当てました。

4

4 に答える 4

23

あなたが提供した答えに加えてItemIsTristate、親要素のフラグを使用してロジックを簡素化できます。

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys

def main(): 
    app     = QApplication (sys.argv)
    tree    = QTreeWidget ()
    headerItem  = QTreeWidgetItem()
    item    = QTreeWidgetItem()

    for i in xrange(3):
        parent = QTreeWidgetItem(tree)
        parent.setText(0, "Parent {}".format(i))
        parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
        for x in xrange(5):
            child = QTreeWidgetItem(parent)
            child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
            child.setText(0, "Child {}".format(x))
            child.setCheckState(0, Qt.Unchecked)
    tree.show() 
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

コードの最も重要な 3 行は次のとおりです。

parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)

これは、親要素を 3 つの状態のチェック ボックスに設定します。

child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setCheckState(0, Qt.Unchecked)

これらは子を選択可能に設定し、デフォルトをオフに設定します。子のチェックボックスに状態が指定されていない場合、チェックボックス要素は表示されません。


上記のコードは非常に単純なツリーを構築します。

シンプルツリー

ただし、親要素のチェック ボックスをオンにすると、すべての子要素が自動的に選択されます。

親が選択されました

単一の子を選択解除したい場合、親は部分的に選択された状態 (Tri-State) に入ります。

トライステート

すべての子が選択解除されている場合、親は自動的に選択解除されます。親が選択されていない場合、すべての子も自動的に選択解除されます。

于 2015-07-10T14:04:44.327 に答える
2

QTreeWidgetItem実際には、かなり簡単に使用できるチェック ボックスが組み込まれています。

例えば:

item = QTreeWidgetItem(self.treeWidget)

item.setCheckState(0, QtCore.Qt.Unchecked)
于 2015-07-10T13:52:14.757 に答える