带复选框和拖放功能的 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_())
我正在尝试构建一个 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_())