繁体   English   中英

PyQt5 QListWidget 带复选框和拖放

[英]PyQt5 QListWidget with checkboxes and drag and drop

我正在尝试构建一个 PyQt5 应用程序,我想创建一个列表小部件,其元素可以拖放,但每个小部件也与一个复选框相关联。

我可以像这样创建一个可拖放的QListWidget

import sys

from PyQt5.QtWidgets import QApplication, QListWidget


if __name__ == '__main__':
    app = QApplication(sys.argv)

    lw = QListWidget()
    for i in range(5):
        text = f'Item {i}'
        lw.addItem(text)

    lw.setDragDropMode(lw.InternalMove)
    lw.show()

    sys.exit(app.exec_())

但是,当我尝试为每个项目添加复选框时,拖放功能似乎中断了。 拖放不适用于以下代码:

import sys

from PyQt5.QtWidgets import QApplication, QListWidget, QListWidgetItem
from PyQt5.QtCore import Qt


if __name__ == '__main__':
    app = QApplication(sys.argv)

    lw = QListWidget()
    for i in range(5):
        text = f'Item {i}'
        item = QListWidgetItem(text)
        item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
        lw.addItem(item)

    lw.setDragDropMode(lw.InternalMove)  # Drag and drop doesn't work...
    lw.show()

    sys.exit(app.exec_())

有没有办法获得每个都包含一个复选框的可拖放元素?

提前致谢

默认情况下,QListWidgetItem 激活了以下标志:

Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled

但是您通过删除 ItemIsDragEnabled 标志来覆盖它,防止项目被拖动。

所以解决方案是使用|激活标志| 操作员:

item.setFlags(item.flags() | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)

虽然你看到这是不必要的,因为这些标志默认是激活的,最简单的事情是激活初始状态:

import sys

from PyQt5.QtWidgets import QApplication, QListWidget, QListWidgetItem
from PyQt5.QtCore import Qt

if __name__ == '__main__':
    app = QApplication(sys.argv)

    lw = QListWidget()
    for i in range(5):
        text = f'Item {i}'
        item = QListWidgetItem(text)
        item.setCheckState(Qt.Unchecked)
        lw.addItem(item)
    lw.setDragDropMode(lw.InternalMove)
    lw.show()
    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM