zoukankan      html  css  js  c++  java
  • [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_())

    实现效果:

    ===

  • 相关阅读:
    通过socket,实现简易版的通讯
    控制台报错[WDS] Disconnected!
    js里面可以提升性能的有哪些方法
    构造函数与普通函数的区别
    事件循环(event loop)
    二维数组的创建以及简单举例
    es5数组的api(了解)
    字符串的api (基础)
    git常用命令
    连接MongoDB失败,处理办法
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/13130150.html
Copyright © 2011-2022 走看看