qt - 如何在 PyQt 中的自定义 Qt.ItemFlags 实例中找到特定的 Qt.ItemFlag 出现?

标签 qt pyqt pyqt4

我有一个 QTreeWidgetQTreeWidgetItems .方法QTreeWidgetItem.flags()返回我 Qt.ItemFlags实例。

The Qt.ItemFlags type is a typedef for QFlags. It stores an OR combination of ItemFlag values.



好吧,假设现在我有一个 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_())

最佳答案

就像 Qt 中的许多“标志”和“属性”一样,ItemFlags使用位掩码将多个选项组合成一个值。这可以使用按位运算符进行测试。

以下是检查项目是否可检查的方法:

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

Bitwise Masking

它是这样工作的:
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

关于qt - 如何在 PyQt 中的自定义 Qt.ItemFlags 实例中找到特定的 Qt.ItemFlag 出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13616329/

相关文章:

python-2.7 - QT设计器: how to align a button to the right (in resizable form)

c++ - 误报警告 PVS Studio : V808 object of type was created but was not utilized

c++ - 如何将 Qt 样式表移动到外部文件但将其编译到资源中?

python - PyQt5 中的 WebSocket 服务器,显然是正确的,但我无法连接

python - 在 PyQt 应用程序中退出时提示

python - PyQt:如何在 QStackedWidget 中切换小部件

python - pyqt4:如何查看QWebPage?

c++ - 在 Qt 中更改标签

c++ - Qt - 具有枚举类类型的 Q_DECLARE_METATYPE()

python - 如何动画 qpushbutton 背景的渐变在悬停时从左到右移动?