11

QTreeWidgetItems含むQTreeWidgetがあります。メソッドQTreeWidgetItem.flags()は、 Qt.ItemFlagsインスタンスを返します。

Qt.ItemFlagsタイプは、QFlagsのtypedefです。ItemFlag値のORの組み合わせを格納します。

さて、QTreeWidgetItemsの1つがあり、それを確認する必要があると仮定します—それはチェック可能かどうか?つまり、Qt.ItemFlagsインスタンスで発生するItemFlag(私の場合はQt.ItemIsUserCheckable)を見つける必要があります。

どうやってするの?

変更できるシンプルで整然とした例を次に示します(コメント行でマークされた関心のある部分)。

import sys
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.treeWidget = QtGui.QTreeWidget()
        self.treeWidget.setHeaderHidden(True)
        self.addItems(self.treeWidget.invisibleRootItem())
        self.treeWidget.itemClicked.connect (self.handleClicked)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.treeWidget)
        self.setLayout(layout)

    def addItems(self, parent):
        column = 0

        clients_item = QtGui.QTreeWidgetItem(parent, ['Clients'])
        clients_item.setData(column, QtCore.Qt.UserRole, 'data Clients')
        clients_item.setExpanded(True)

        item_1 = QtGui.QTreeWidgetItem(clients_item, ['Item 1'])
        item_1.setData(column, QtCore.Qt.UserRole, 'data Item 1')
        item_1.setCheckState(column, QtCore.Qt.Unchecked)

        item_2 = QtGui.QTreeWidgetItem(clients_item, ['Item 2'])
        item_2.setData(column, QtCore.Qt.UserRole, 'data Item 2')
        item_2.setCheckState(column, QtCore.Qt.Unchecked)

    def handleClicked(self, item, column):
        if item.checkState(column) == QtCore.Qt.Checked:
            print "checked", item, item.text(column)
        if item.checkState(column) == QtCore.Qt.Unchecked:
            print "NOT checked", item, item.text(column)

        # this part doesn't work ===============================
        # begin of part
        flags = item.flags()
        if QtCore.Qt.ItemIsUserCheckable in flags:
            print "is checkable", item, item.text(column)
        else:
            print "is NOT checkable", item, item.text(column)
        # end of part ==========================================    

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
4

1 に答える 1

29

Qtの多くの「フラグ」や「属性」と同様に、ItemFlagsビットマスクを使用して、複数のオプションを1つの値に結合します。これは、ビット演算子を使用してテストできます。

アイテムがチェック可能かどうかを確認する方法は次のとおりです。

flags = item.flags()
if flags & QtCore.Qt.ItemIsUserCheckable:
    print "is checkable", item, item.text(column)

ビット単位のマスキング

それはこのように動作します:

Qt.NoItemFlags          0   It does not have any properties set.
Qt.ItemIsSelectable     1   It can be selected.
Qt.ItemIsEditable       2   It can be edited.
Qt.ItemIsDragEnabled    4   It can be dragged.
Qt.ItemIsDropEnabled    8   It can be used as a drop target.
Qt.ItemIsUserCheckable  16  It can be checked or unchecked by the user.
Qt.ItemIsEnabled        32  The user can interact with the item.
Qt.ItemIsTristate       64  The item is checkable with three separate states.

したがって、値はこれらの値の組み合わせになります。選択可能、編集可能、および有効になっているとしましょう。簡単にするために、フラグの代わりに数値を使用します。それらを論理ORと組み合わせます。

flags = 1 | 2 | 32
# 35

そして、値の存在をテストするために、論理積を使用します。

# is it editable?
flags & 2
# 2 # would evaluate to True

# is it checkable?
flags & 16
# 0 # would evaluate to False

XOR演算を使用して、maksのフラグの状態を切り替えることもできます。

# toggle off the editable flag
flags ^= 2
# toggle on the editable flag
flags ^= 2
于 2012-11-28T23:44:47.100 に答える