PyQt5 QListWidget с флажками и перетаскиванием - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь создать приложение 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 Ответ

1 голос
/ 13 марта 2019

По умолчанию для 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_())
...