对于“python GUI库图形界面开发之PyQt5拖放控件实例详解”的完整攻略,可以按照以下步骤进行:
1. PyQt5拖放控件简介
首先,需要简要介绍一下PyQt5拖放控件的概念和作用。拖放控件是指用户在界面上通过鼠标点选并拖拽某个控件,然后将其放置到目标控件上的一种交互方式。在PyQt5中,拖放控件主要由QDrag
和QDropEvent
两个类实现,其作用通常包括:
- 实现自定义拖放请求,并在拖放开始前对拖动物体进行处理
- 在拖拽时显示一些拖拽效果,比如拖拽过程中鼠标的形状、拖拽位置的图标或预览等
- 通过QDropEvent事件接收已经落入进来的QDrag对象,并对其进行处理
2. 实现基本的拖放功能
接下来,我们将具体实现一个简单的拖放控件功能。假设我们有两个QListWidget控件,其中一个控件为拖动源,另一个控件为拖动目标。我们需要实现拖动源QListWidget中的文字选项,然后将其拖动到目标QListWidget控件中。
首先,需要实现前述QDrag
和QDropEvent
的子类,以完成拖动与接收操作。代码如下:
class myQDrag(QDrag):
def __init__(self, parent):
super().__init__(parent)
def update_image(self):
print("update_image")
pixmap = self.pixmap()
painter = QPainter(pixmap)
painter.setPen(QPen(Qt.red, 4))
painter.drawRect(pixmap.rect())
painter.end()
self.setPixmap(pixmap)
def mousePressEvent(self, event):
print("mousePressEvent")
class myQDropEvent(QDropEvent):
def __init__(self, event):
super().__init__(event)
def update_image(self):
print("update_image")
pixmap = self.pixmap()
painter = QPainter(pixmap)
painter.setPen(QPen(Qt.red, 4))
painter.drawRect(pixmap.rect())
painter.end()
self.setPixmap(pixmap)
接下来,需要为QListWidget控件设置拖动与接收操作的特性:
class DragWidgetUI(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
# 拖拽相关
self.setAcceptDrops(True)
self.drag_item = None
self.drag_type = None
self.listWidget.drag_item = None
self.listWidget.drag_type = None
self.listWidget.setDragEnabled(True)
self.listWidget.setDefaultDropAction(Qt.MoveAction)
self.listWidget.setDropIndicatorShown(True)
self.listWidget.itemPressed.connect(self.listWidgetItemPressed)
self.listWidget.itemEntered.connect(self.listWidgetItemEntered)
self.listWidget_2.drag_item = None
self.listWidget_2.drag_type = None
self.listWidget_2.setAcceptDrops(True)
self.listWidget_2.setDropIndicatorShown(True)
self.listWidget_2.setDragEnabled(False)
self.listWidget_2.itemEntered.connect(self.listWidget_2ItemEntered)
self.listWidget_2.itemDropped.connect(self.listWidget_2ItemDropped)
# 拖拽动作
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_type = "self"
self.drag_item = self.listWidget.currentItem()
drag = myQDrag(self.listWidget)
mime = QMimeData()
mime.setText(self.drag_item.text())
drag.setMimeData(mime)
drag.exec()
# 接收操作
def dragEnterEvent(self, event):
if event.mimeData().hasText():
self.listWidget_2.drag_item = self.listWidget_2.itemAt(event.pos())
event.accept()
else:
event.ignore()
def dragMoveEvent(self, event):
if event.mimeData().hasText():
self.listWidget_2.drag_item = self.listWidget_2.itemAt(event.pos())
event.accept()
else:
event.ignore()
def dropEvent(self, event):
if self.listWidget_2.drag_item:
self.listWidget_2.drag_item.setText(event.mimeData().text())
self.listWidget_2.drag_item = None
3. 实现更丰富的拖放控件功能
除了基本的拖放控件功能之外,还可以实现更丰富的拖放控件功能。例如,我们可以实现在拖动控件时实时更新拖动效果的功能,以及在拖拽完成后的目标控件中给定预览效果和修饰效果。
具体实现过程如下:
class DragWidgetUI(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
# 拖拽相关
self.drag_item = None
self.drag_type = None
self.listWidget_2.setAcceptDrops(True)
self.listWidget_2.setDropIndicatorShown(True)
self.listWidget_2.setDragEnabled(False)
self.listWidget_2.itemEntered.connect(self.listWidget_2ItemEntered)
self.listWidget_2.itemDropped.connect(self.listWidget_2ItemDropped)
def listWidgetItemPressed(self, item):
self.drag_type = "self"
self.drag_item = item
# 改变拖动时的图标
def listWidgetItemEntered(self, item):
if not item:
return
if item != self.listWidget_2.drag_item:
self.listWidget_2.drag_item = item
drag = myQDrag(self.listWidget)
mime = QMimeData()
mime.setText(self.drag_item.text())
drag.setMimeData(mime)
drag.setPixmap(QPixmap(r"images/1.jpg").scaled(QSize(25, 25)))
drag.update_image()
drag.exec()
# 设置拖拽假象
def listWidget_2ItemEntered(self, item):
if not item:
return
if item != self.drag_item:
self.drag_item = item
self.listWidget_2.drag_item = item
self.listWidget_2.setCurrentItem(self.listWidget_2.drag_item)
drag = myQDrag(self.listWidget_2)
mime = QMimeData()
mime.setText(self.drag_item.text())
drag.setMimeData(mime)
drag.setPixmap(QPixmap(r"images/1.jpg").scaled(QSize(25, 25)))
drag.update_image()
drag.exec(Qt.CopyAction | Qt.MoveAction)
# 定义接收处理函数
def listWidget_2ItemDropped(self, item):
if item != self.drag_item:
self.drag_item.setText(item.text())
self.drag_item = None
self.listWidget_2.drag_item = None
至此,我们就成功实现了更丰富的拖放控件功能。
以上便是本篇攻略的核心内容,其中第二部分是实现单纯的拖放控件功能,第三部分是在其基础上进行了更加丰富的功能扩展。在实际操作中,读者可以根据需要进行调整和扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python GUI库图形界面开发之PyQt5拖放控件实例详解 - Python技术站