簡體   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