You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:28:22