许多PyQt窗口部件都支持拖放操作,如QColumnView,QHeaderView, QListView, QTableView 和 QTreeView,我们要做的只是打开支持模式使其工作即可。
.setDragEnabled(True) #设置为可拖动
.setAcceptDrops(True) #设置为可放下,只有“放下”是从QWidget继承而来
这种方式的拖放行为是复制,而不是移动。
如下的程序有两个列表控件(QListView),左边的列表控件使用默认模式,右边的列表控件使用图标模式。项目(QListWidgetItem)可以在它们之间拖放复制。
代码如下:
代码语言:javascript复制import sys
from PyQt5.QtWidgets import QWidget, QApplication, QListWidget, QHBoxLayout,
QListWidgetItem
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QSize
class Widget(QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.setWindowTitle("拖放事件示例")
listWidget = QListWidget()
listWidget.setAcceptDrops(True) #设置为可放下
listWidget.setDragEnabled(True) #设置为可拖动
iconList = ["英短", "布偶", "折耳", "波斯", "缅因", "森林"]
for i in iconList:
listWidget.addItem(QListWidgetItem(QIcon(i ".jpg"), i))
iconListWidget = QListWidget()
iconListWidget.setViewMode(QListWidget.IconMode) #设置为图标模式
iconListWidget.setIconSize(QSize(100, 100)) #可设置图标大小
iconListWidget.setAcceptDrops(True) #设置为可放下
iconListWidget.setDragEnabled(True) #设置为可拖动
layout = QHBoxLayout()
layout.addWidget(listWidget)
layout.addWidget(iconListWidget)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
mw = Widget()
mw.show()
sys.exit(app.exec_())
这样的内置拖放功能非常方便,通常也足够实用。不过,如果需要使其能够处理自定义数据,或者,就必须重新实现一些事件处理程序。