一、將文本拖拽到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_())
實現效果:
===