开源第四篇:功能实现之拖拽功能与配置文件。
写这个功能的初衷,是因为,每次调试我都要手动敲命令,太麻烦了,想偷个懒,所以直接给这功能加上了,顺便衍生出了另一个想法,配置文件自动填写相关数据。
先看个简单的拖拽功能:
很明显吧,还是比较便捷的。所以我们本章,就在之前的基础上实现这部分功能,一起来看看。
实现拖拽
首先需要知道的是,我们是将QLabel标签拖入到QLineEdit标签中。
知道起手操作了,那么就来实现吧。
第一步-重写父类
from PyQt5.QtCore import Qt, QMimeData from PyQt5.QtGui import QDragEnterEvent, QDropEvent, QDrag
class DraggableLabel(QLabel): def __init__(self, text, parent=None): super().__init__(text, parent) self.setAcceptDrops(True) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: drag = QDrag(self) mime_data = QMimeData() mime_data.setText(self.text()) drag.setMimeData(mime_data) drag.exec_(Qt.CopyAction)
mousePressEvent(self, event):鼠标按下事件处理方法。当用户点击鼠标左键时,创建一个 QDrag 对象,然后创建一个 QMimeData 对象,将标签的文本设置为该 QMimeData 对象的文本数据。最后,使用 exec_ 方法开始拖动操作,使用 Qt.CopyAction 指定拖动操作的类型为复制
class DropLineEdit(QLineEdit): def __init__(self, parent=None): super().__init__(parent) self.setAcceptDrops(True) def dragEnterEvent(self, event: QDragEnterEvent): if event.mimeData().hasText(): event.acceptProposedAction() def dropEvent(self, event: QDropEvent): self.setText(event.mimeData().text())
dragEnterEvent(self, event: QDragEnterEvent):拖入事件处理方法。当有拖动操作进入输入框的范围时,该方法会被触发。在这里,检查拖动事件的 mimeData() 中是否包含文本数据,如果是,则接受拖动操作,允许将数据放置到输入框中
dropEvent(self, event: QDropEvent):拖放事件处理方法。当用户完成拖放操作时,该方法会被触发。在这里,从拖动事件的 mimeData() 中获取文本数据,并将其设置为输入框的文本。
第二步-调用
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.label = DraggableLabel("Drag me", self) self.label.setGeometry(20, 20, 100, 30) self.line_edit = DropLineEdit(self) self.line_edit.setGeometry(20, 70, 200, 30) self.setWindowTitle('Drag and Drop Example') self.setGeometry(300, 300, 300, 150) self.show()
就这样,最后一步实例化这个UI,运行起来就可以看到效果了。
if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
那么嵌入到工具中呢,如何实现呢。
嵌入到自动化电池监测工具中
第二种实现方式
上面那种实现方式,在已有的UI中不容易嵌入进入,所以换一种是实现方式。
# 拖拽 class DragAndDropFilter(QObject): def __init__(self, source_widget, target_widget): super().__init__() self.source_widget = source_widget self.target_widget = target_widget self.source_widget.installEventFilter(self) def eventFilter(self, obj, event): if obj == self.source_widget and event.type() == QEvent.MouseButtonPress: if event.button() == Qt.LeftButton: mime_data = QMimeData() mime_data.setText(self.source_widget.text()) drag = QDrag(self.source_widget) drag.setMimeData(mime_data) result = drag.exec_(Qt.MoveAction) if result == Qt.MoveAction: return True if obj == self.target_widget and event.type() == QEvent.Drop: mime_data = event.mimeData().text() self.target_widget.setText(mime_data) return True return super().eventFilter(obj, event)
依旧是重写父类方法,不过实现过程变了,稍微结合了一下。
UI类中如何使用
class BatterySystem(QMainWindow): def __init__(self): super(BatterySystem, self).__init__() # //////////UI_Main self.UI = Ui_MainWindow() self.UI.setupUi(self) # 拖拽 self.infoCommanddragdrop = DragAndDropFilter(self.UI.infoCommand, self.UI.textEdit_Send) self.batCommanddragdrop = DragAndDropFilter(self.UI.batCommand, self.UI.textEdit_Send)
来看看效果
下一章将会讲到根据配置文件将所需要且不长修改的文本信息自动写入到QLineEdit中