六、PyQt5 之 拖拽与剪切板

一、拖拽

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
让控件支持脱宅动作

A.setDragEnabled(True)  : A控件可以拖拽
B.setAcceptDrops(True)  : B控件可以接受其他空间脱宅过来的动作

B 需要两个事件
1. dragEnterEvent 将A拖到B触发
2. dropEvent      在B区域放下A时候触发
"""

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MyComboBox(QComboBox):
    def __init__(self):
        super(MyComboBox, self).__init__()
        # 控件可以接受其他空间脱宅过来的动作
        self.setAcceptDrops(True)

    # 重写该方法, 拖过来没松鼠标
    def dragEnterEvent(self, event):
        print(event)
        # 只接收文本
        if event.mimeData().hasText():
            event.accept()
        else:
            event.ignore()

    # 重写该方法, 拖过来松下鼠标
    def dropEvent(self, event):
        self.addItem(event.mimeData().text())


class DrapDropDemo(QWidget):
    def __init__(self):
        super(DrapDropDemo, self).__init__()
        formLayout = QFormLayout()
        formLayout.addRow(QLabel("请将左边的文本拖拽到右边的下拉列表中"))
        lineEdit = QLineEdit()
        # 让QLineEdit控件可拖动
        lineEdit.setDragEnabled(True)
        combo = MyComboBox()
        formLayout.addRow(lineEdit, combo)
        self.setWindowTitle("拖拽案例")
        self.setLayout(formLayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrapDropDemo()
    main.show()
    sys.exit(app.exec_())

二、使用剪切板

#!/usr/bin/python
# -*- coding:utf-8 -*-
"""
使用剪贴板
也就是复制粘贴
"""

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class ClipBoard(QDialog):
    def __init__(self):
        super(ClipBoard, self).__init__()
        textCopyButton = QPushButton("复制文本")
        textPasteButton = QPushButton("粘贴文本")

        htmlCopyButton = QPushButton("复制HTML")
        htmlPasteButton = QPushButton("粘贴HTML")

        imageCopyButton = QPushButton("复制图像")
        imagePasteButton = QPushButton("粘贴图像")

        self.textLabel = QLabel("默认文本")
        self.imageLabel = QLabel()
        # 栅格布局
        layout = QGridLayout()
        layout.addWidget(textCopyButton, 0, 0)
        layout.addWidget(imageCopyButton, 0, 1)
        layout.addWidget(htmlCopyButton, 0, 2)
        layout.addWidget(textPasteButton, 1, 0)
        layout.addWidget(imagePasteButton, 1, 1)
        layout.addWidget(htmlPasteButton, 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("剪切板演示")

    def copyText(self):
        clipboard = QApplication.clipboard()
        # 复制文本按钮,会自动复制hello world内容
        clipboard.setText("hello world")

    def pasteText(self):
        clipboard = QApplication.clipboard()
        self.textLabel.setText(clipboard.text())

    def copyImage(self):
        clipboard = QApplication.clipboard()
        clipboard.setPixmap(QPixmap("../images/python.png"))

    def pasteImage(self):
        clipboard = QApplication.clipboard()
        self.imageLabel.setPixmap(clipboard.pixmap())

    def copyHtml(self):
        mimeData = QMimeData()
        mimeData.setHtml('<b>Bold and <font color=red>Red</font></b>')
        clipboard = QApplication.clipboard()
        clipboard.setMimeData(mimeData)

    def pasteHtml(self):
        clipboard = QApplication.clipboard()
        mimeData = clipboard.mimeData()
        if mimeData.hasHtml():
            self.textLabel.setText(mimeData.html())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = ClipBoard()
    main.show()
    sys.exit(app.exec_())

 

posted on 2022-07-02 12:58  软饭攻城狮  阅读(26)  评论(0编辑  收藏  举报

导航