[Python自学] PyQT5-控件拖拽、剪切板

一、将文本拖拽到QComboBox中

想让控制支持拖拽,要满足以下几个条件:

1)被拖拽的控件要设置支持拖拽 setDragEnabled(True)

2)拖拽放置控件要设置允许接收 setAcceptDrops(True)

完整案例Demo:

import sys

# 导入QT,其中包含一些常量,例如颜色等
from PyQt5.QtCore import Qt
# 导入常用组件
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QFormLayout
from PyQt5.QtWidgets import QComboBox, QLabel, QLineEdit
# 使用调色板等
from PyQt5.QtGui import QIcon
from PyQt5 import QtGui


# 自定义一个comboBox控件,让其能够接受外部拖拽进来的文本内容
class MyComboBox(QComboBox):
    def __init__(self):
        super(MyComboBox, self).__init__()
        self.setAcceptDrops(True)

    # 拖拽内容进来的时候触发这个事件
    def dragEnterEvent(self, a0: QtGui.QDragEnterEvent) -> None:
        print(a0)
        if a0.mimeData().hasText():
            a0.accept()
        else:
            a0.ignore()

    # 内容放置(松开鼠标时)时触发这个事件
    def dropEvent(self, a0: QtGui.QDropEvent) -> None:
        self.addItem(a0.mimeData().text())


class DemoWin(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(300, 150)
        layout = QFormLayout()
        layout.addRow(QLabel("请将左边的文本拖拽到右边的下拉列表中"))
        # 这个lineEdit中的文本支持拖拽
        lineEdit = QLineEdit()
        lineEdit.setDragEnabled(True)  # 设置让lineEdit中的文本可拖拽
        # 这个自定义comboBox接受拖拽内容
        myConboBox = MyComboBox()
        layout.addRow(lineEdit, myConboBox)

        self.setLayout(layout)
        # 添加窗口标题
        self.setWindowTitle("拖拽Demo")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("images/icon.ico"))
    # 创建一个主窗口
    mainWin = DemoWin()
    # 显示
    mainWin.show()
    # 主循环
    sys.exit(app.exec_())

实现效果:

二、使用剪切板

通过剪切板共享数据,Ctrl+C & Ctrl+V。

完整Demo:

import sys

# 导入QT,其中包含一些常量,例如颜色等
from PyQt5.QtCore import Qt, QMimeData
# 导入常用组件
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QPushButton, QLabel
# 使用调色板等
from PyQt5.QtGui import QPixmap, QIcon


class DemoWin(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 复制文本和粘贴文本
        textCopyButton = QPushButton('复制文本')
        textPasteButton = QPushButton('粘贴文本')
        # 复制HTML和粘贴HTML
        htmlCopyButton = QPushButton('复制HTML')
        htmlPasteButton = QPushButton('粘贴HTML')
        # 复制图片和粘贴图片
        imageCopyButton = QPushButton('复制图片')
        imagePasteButton = QPushButton('粘贴图片')

        # 用于显示粘贴的文本和html
        self.textLabel = QLabel('默认文本')
        # 用于显示粘贴的图片
        self.imageLabel = QLabel()

        layout = QGridLayout()
        layout.addWidget(textCopyButton, 0, 0)
        layout.addWidget(textPasteButton, 1, 0)
        layout.addWidget(htmlCopyButton, 0, 1)
        layout.addWidget(htmlPasteButton, 1, 1)
        layout.addWidget(imageCopyButton, 0, 2)
        layout.addWidget(imagePasteButton, 1, 2)

        layout.addWidget(self.textLabel, 2, 0, 1, 2)
        layout.addWidget(self.imageLabel, 2, 2)

        self.setLayout(layout)
        # 事件关联
        textCopyButton.clicked.connect(self.copyText)
        textPasteButton.clicked.connect(self.pasteText)
        htmlCopyButton.clicked.connect(self.copyHtml)
        htmlPasteButton.clicked.connect(self.pasteHtml)
        imageCopyButton.clicked.connect(self.copyImage)
        imagePasteButton.clicked.connect(self.pasteImage)

        # 添加窗口标题
        self.setWindowTitle("QLabel控件Demo")

    # 实现复制文本,即将文本放入clipboard即可
    def copyText(self):
        # 定义一个剪切板实例
        clipboard = QApplication.clipboard()
        # 将一段文本写入clipboard
        clipboard.setText('Hello World.')

    # 粘贴文本,即从clipboard中取出文本,设置到控件中
    def pasteText(self):
        clipboard = QApplication.clipboard()
        # 将clipboard中的文本直接写入textLabel中
        self.textLabel.setText(clipboard.text())

    # 实现复制HTML,即将包含HTML的QMimeData对象放入clipboard即可
    def copyHtml(self):
        clipboard = QApplication.clipboard()
        mimeData = QMimeData()
        mimeData.setHtml('<b>Bold and <font color=red>Red</font></b>')
        clipboard.setMimeData(mimeData)

    # 实现粘贴HTML,即从clipboard中取出QMimeData对象,然后设置到控件中
    def pasteHtml(self):
        clipboard = QApplication.clipboard()
        mimeData = clipboard.mimeData()
        if mimeData.hasHtml():
            self.textLabel.setText(mimeData.html())

    # 实现复制图片,即将QPixmap对象放进剪切板中
    def copyImage(self):
        clipboard = QApplication.clipboard()
        clipboard.setPixmap(QPixmap('./images/ailusha.png'))

    # 从剪切板中取出图片对象,并设置到控件中
    def pasteImage(self):
        clipboard = QApplication.clipboard()
        self.imageLabel.setPixmap(clipboard.pixmap())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("images/icon.ico"))
    # 创建一个主窗口
    mainWin = DemoWin()
    # 显示
    mainWin.show()
    # 主循环
    sys.exit(app.exec_())

实现效果:

 

 

===

 

posted @ 2020-06-15 12:34  风间悠香  阅读(2034)  评论(0编辑  收藏  举报