Как найти конкретный Qt.Вхождение ItemFlag в пользовательский Qt.Экземпляр ItemFlags в PyQt?

У меня есть QTreeWidget С QTreeWidgetItems. Метод QTreeWidgetItem.flags () возвращает меня Qt.ItemFlags экземпляра.

на Qt.ItemFlags type является typedef для QFlags. Он хранит или комбинацию ItemFlag значения.

Ну, предположим теперь, что у меня один из моих QTreeWidgetItems и мне нужно узнать - это можно проверить или нет? Другой слова, мне нужно найти вхождение ItemFlag (для моего случая это Qt.ItemIsUserCheckable) в Qt.ItemFlags экземпляра.

Как это сделать?

вот простой и аккуратный пример, который вы можете изменить (заинтересованная часть, отмеченная строками комментариев):

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_())

1 ответов


как и многие "флаги" и "атрибуты" в Qt, ItemFlags использует битовые маски для объединения нескольких параметров в одно значение. Это можно проверить с помощью побитовых операторов.

вот как вы бы проверить, если элемент является триггерной:

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.

таким образом, значение будет некоторой комбинацией этих значений. Допустим, он выбирается, редактируется и включен. Для простоты я буду просто используйте числовые значения вместо флагов. Мы объединяем их с логическим или:

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

вы также можете переключать состояние флагов в maks с помощью операции XOR.

# toggle off the editable flag
flags ^= 2
# toggle on the editable flag
flags ^= 2