PyQt5 QListWidget与复选框和拖放

时间:2019-03-13 15:19:35

标签: python pyqt pyqt5 qlistwidget

我正在尝试构建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_())

有没有一种方法可以获取每个元素都包含一个复选框的可拖放元素?

预先感谢

1 个答案:

答案 0 :(得分:1)

默认情况下,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_())