实战PyQt5: 100-给应用添加拖放支持( 三 )


  • mimeData(): 返回含有所传输数据和MIME类型信息的QMimeData类的实例 。
  • pos(): 返回QPoint类的实例 , 为拖放对象放置的整数坐标 。
  • posF():返回QPointF类的实例 , 为拖放对象放置的浮点坐标 。
  • possibleAction(): 返回拖放可能的操作组合 , 如:
if event.possibleActions () & Qt.MoveAction:print ("Move Action")if event.possibleActions () &Qt.CopyAction:print ("Copy Action")
  • proposedAction(): 返回默认的放置操作;
  • acceptProposedAction():表示已准备好接受传输的数据和由proposalAction()返回的默认操作 。 该方法(或者accept()方法)必须在dragEnterEvent()中调用 , 否则 , dropEvent()不会被调用 。
  • setDropAction(action): 允许在放置时指定为action. 做了此设置后 , 必须调用accept( )方法, 而不是acceptProposedAction( )方法 。
  • dropAction(): 返回放置时进行的操作 。 如果用setDropAction( )进行了更改 , 可能与proposedAction ()的返回值不一致 。
  • keyboardModifiers(): 用于判断按下了哪些修饰键 (, , , 等) 。
  • mouseButtons(): 用于判断在拖放过程中按下的鼠标键 。
  • source( ): 如果拖放是从另一个应用程序来的 , 返回为None;否则 , 返回对拖放源控件的引用 。
QDragMoveEvent类的方法有:
  • accept(QRect rect): 表明允许后续的移动操作 。rect用来指定可接受拖放操作的区域 。
  • ignore(QRect rect): 表明不允许后续的移动操作 。rect用来指定不接受拖放操作的区域 。
  • answerRect (): 返回可接受拖放操作区域的QRect对象 。
Qt中的有些控件 , 如单行文本控件 , 已有拖放功能 。
拖放测试测试代码中MyLabel类继承自QLabel , 它可以接收QLineEdit里面选中的文字拖入并显示 。 完整代码如下:
import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qtfrom PyQt5.QtGui import QFontfrom PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit, QFrame, QLabel, QVBoxLayout) class MyLabel(QLabel):def __init__(self, title, parent = None):super(MyLabel, self).__init__(title, parent)#接受拖入操作self.setAcceptDrops(True)#加边框self.setFrameShape(QFrame.Box)self.setLineWidth(1)#文字居中显示self.setAlignment(Qt.AlignCenter)#字体加大显示self.setFont(QFont(self.font().family(), 24))#拖动进入事件def dragEnterEvent(self, event):if(event.mimeData().hasFormat('text/plain')):event.accept()else:event.ignore()#放置事件def dropEvent(self, event):self.setText(event.mimeData().text()) class DemoDragDropEvent(QWidget):def __init__(self, parent=None):super(DemoDragDropEvent, self).__init__(parent)# 设置窗口标题self.setWindowTitle('实战PyQt5: 拖放操作演示')# 设置窗口大小self.resize(400, 160)self.initUi()def initUi(self):mainLayout = QVBoxLayout()editBox = QLineEdit('拖动选中的文字')editBox.setDragEnabled(True)textBox = MyLabel('文字拖放到这里')mainLayout.addWidget(editBox)mainLayout.addWidget(textBox)self.setLayout(mainLayout)if __name__ == '__main__':app = QApplication(sys.argv)window = DemoDragDropEvent()window.show()sys.exit(app.exec())运行效果如下图所示:
实战PyQt5: 100-给应用添加拖放支持文章插图
拖放技术演示
本文知识点