[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_())

實現效果:

 

 

===

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM