PySide6拖拽文本:如何实现剪切式移动而非复制粘贴?
实现QLineEdit到按钮的拖拽剪切功能
要将现有拖拽复制效果改为剪切(拖拽后删除源QLineEdit中的选中文本),只需调整拖拽动作类型并确保目标控件正确响应Move动作,具体修改如下:
修改要点
- 让按钮的拖拽进入事件接受Move类型的拖拽动作
- 在按钮的放置事件中明确标记动作为Move,触发源控件的剪切逻辑
修改后的完整代码
from PySide6.QtWidgets import ( QApplication, QMainWindow, QLineEdit, QPushButton, QVBoxLayout, QWidget, ) from PySide6.QtCore import Qt class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True) def dragEnterEvent(self, event): # 检查文本存在且拖拽动作支持Copy或Move if event.mimeData().hasText() and (event.proposedAction() in (Qt.CopyAction, Qt.MoveAction)): event.acceptProposedAction() else: event.ignore() def dropEvent(self, event): self.setText(event.mimeData().text()) # 明确设置动作为Move,告知源控件执行剪切 event.setDropAction(Qt.MoveAction) event.accept() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Drag and drop - Cut') self.resize(260, 130) line_edit = QLineEdit() line_edit.setDragEnabled(True) line_edit.setText('Text to drag') line_edit.selectAll() button = Button("Button", self) layout = QVBoxLayout() layout.addWidget(line_edit) layout.addWidget(button) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec()
核心说明
event.acceptProposedAction():允许目标控件接受支持的拖拽动作,这里包含复制和剪切两种类型event.setDropAction(Qt.MoveAction):标记本次拖拽为剪切操作,QLineEdit会自动删除选中的文本,无需额外编写删除逻辑
内容的提问来源于stack exchange,提问作者JLPrieto
相关产品推荐
相关产品推荐

