PyQt5 QListWidget带有复选框并拖放

问题描述 投票:1回答:1

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

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

提前致谢

python pyqt pyqt5 qlistwidget
1个回答
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_())
© www.soinside.com 2019 - 2024. All rights reserved.