PyQt 5 매일 배 워 야 할 드래그 앤 드 롭 이벤트

PyQt 5 튜 토리 얼 의 이 부분 에서 드래그 앤 드 롭 작업 에 대해 토론 할 것 입 니 다.
컴퓨터 그래 픽 사용자 인터페이스 에서 드래그 이 벤트 는 가상 대상 을 클릭 하고 다른 위치 나 다른 가상 물체 로 드래그 하 는 동작 입 니 다.일반적인 상황 에서 이것 은 여러 동작 을 호출 하거나 두 추상 적 인 대상 간 의 관련 유형 을 만 드 는 데 사 용 될 수 있다.
드래그 앤 드 롭 이 벤트 는 그래 픽 사용자 인터페이스의 일부분 입 니 다.드래그 앤 드 롭 작업 은 사용자 로 하여 금 복잡 한 일 들 을 직관 적 으로 조작 할 수 있 게 한다.
일반적인 상황 에서 우 리 는 두 가지 유형 을 끌 어 다 놓 을 수 있다.데이터 나 일부 도형 대상 이다.만약 우리 가 한 프로그램 에서 그림 을 다른 프로그램 으로 드래그 한다 면,우 리 는 바 이 너 리 데 이 터 를 드래그 합 니 다.Firefox 탭 을 끌 어 다 놓 고 다른 곳 으로 이동 하면 그림 구성 요 소 를 끌 어 다 놓 습 니 다.
단순 드래그 이벤트
이 예 에서 우 리 는 QLine Edit 컨트롤 과 QPushButton 컨트롤 이 있 습 니 다.우 리 는 한 줄 의 텍스트 편집 컨트롤 에서 입력 한 텍스트 를 선택 한 후 단추 컨트롤 에 끌 어 다 놓 은 후 마 우 스 를 풀 면 단추 의 탭 이 달라 집 니 다.

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

"""
PyQt5   

           。

  :         
  :http://blog.csdn.net/weiaitaowang
    :2016 8 5 
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)
 self.setAcceptDrops(True)

 def dragEnterEvent(self, e):
 if e.mimeData().hasFormat('text/plain'):
 e.accept()
 else:
 e.ignore()
 def dropEvent(self, e):
 self.setText(e.mimeData().text())

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 edit = QLineEdit('', self)
 edit.setDragEnabled(True)
 edit.move(30, 65)

 button = Button('  ', self)
 button.move(190, 65)

 self.setGeometry(300, 300, 300, 150)
 self.setWindowTitle('    ') 

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 ex.show()
 sys.exit(app.exec_())

이 예 는 간단 한 드래그 앤 드 롭 동작 을 소개 했다.

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)
 self.setAcceptDrops(True)

QPushButton 컨트롤 에 설 치 된 텍스트 를 표시 하기 위해 서 는 QPushButton 컨트롤 의 일부 방법 을 다시 써 야 합 니 다.따라서 우 리 는 우리 만 의 버튼 류 를 만들어 QPushButton 류 에서 물 려 받 을 것 이다.

 self.setAcceptDrops(True)
컨트롤 에 드래그 앤 드 롭 이 벤트 를 사용 합 니 다.

def dragEnterEvent(self, e):
 if e.mimeData().hasFormat('text/plain'):
 e.accept()
 else:
 e.ignore()
우선 dragEnterEvent()방법 을 다시 썼 습 니 다.받 아들 일 데이터 형식(text/plain)을 알려 줍 니 다.일반적인 상황 에서 그것 은 순수한 텍스트 이다.

 def dropEvent(self, e):
 self.setText(e.mimeData().text())
다음은 dropEvent()방법 을 다시 썼 습 니 다.drop 이벤트 가 할 일 을 정의 합 니 다.여기에서 우 리 는 단추 컨트롤 의 텍스트 를 바 꿉 니 다.

edit = QLineEdit('', self)
edit.setDragEnabled(True)
QLine Edit 컨트롤 의 드래그 동작 을 사용 하려 면 setDragEnabled()방법 을 사용 하여 활성화 해 야 합 니 다.
프로그램 실행 후
这里写图片描述
드래그 앤 드 롭 버튼 컨트롤
다음 예 에서 단추 컨트롤 을 끌 어 다 놓 는 방법 을 보 여 줍 니 다.

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

"""
PyQt5   

      ,                    ,           。

  :         
  :http://blog.csdn.net/weiaitaowang
    :2016 8 5 
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)

 def mouseMoveEvent(self, e):
 if e.buttons() != Qt.RightButton:
 return
 mimeData = QMimeData()
 drag = QDrag(self)
 drag.setMimeData(mimeData)
 drag.setHotSpot(e.pos() - self.rect().topLeft())
 drag.exec_(Qt.MoveAction)

 def mousePressEvent(self, e):
 QPushButton.mousePressEvent(self, e)
 if e.button() == Qt.LeftButton:
 print('press')

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 self.setAcceptDrops(True)

 self.button = Button('  ', self)
 self.button.move(100, 65)

 self.setGeometry(300, 300, 280, 150)
 self.setWindowTitle('    ')

 def dragEnterEvent(self, e):
 e.accept()

 def dropEvent(self, e):
 position = e.pos()
 self.button.move(position)

 e.setDropAction(Qt.MoveAction)
 e.accept()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 ex.show()
 sys.exit(app.exec_())

코드 예제 에서 창 에 QPushButton 단추 가 있 습 니 다.만약 우리 가 마우스 왼쪽 단 추 를 누 르 면,'press'메 시 지 를 콘 솔 에 인쇄 합 니 다.마우스 우 클릭 으로 단 추 를 누 르 고 마 우 스 를 이동 하면 드래그 버튼 컨트롤 이 벤트 를 실행 합 니 다.

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)

QPushButton 에서 Button 클래스 를 만 듭 니 다.우 리 는 또한 QPushButton 의 두 가지 방법 인 mouse MoveEvent()와 mousePress Event()를 다시 썼 다.이 mouse MoveEvent()방법 은 드래그 동작 이 시 작 된 곳 입 니 다.

if e.buttons() != Qt.RightButton:
 return
드래그 이벤트 실행 은 마우스 오른쪽 단추 만 사용 할 수 있 음 을 확인 합 니 다.마우스 왼쪽 단 추 를 누 르 면 이벤트 에 사 용 됩 니 다.

mimeData = QMimeData()
 drag = QDrag(self)
 drag.setMimeData(mimeData)
 drag.setHotSpot(e.pos() - self.rect().topLeft())
QDrag 대상 을 만 듭 니 다.이 클래스 는 MIME 기반 드래그 데이터 전송 을 지원 합 니 다.

drag.exec_(Qt.MoveAction)
대상 을 끌 어 당 기 는 start()시작 방법.

def mousePressEvent(self, e):
 QPushButton.mousePressEvent(self, e)
 if e.button() == Qt.LeftButton:
 print('press')
만약 우리 가 마우스 왼쪽 단 추 를 눌 러 서 단 추 를 누 르 면,'press'를 콘 솔 로 인쇄 합 니 다.마우스 버튼 정 보 를 얻 기 위해 서 는 mousePress Event()방법 을 사용 합 니 다.

position = e.pos()
self.button.move(position)
dropEvent()방법 에 있 는 코드 는 마우스 단 추 를 놓 고 드래그 앤 드 롭 작업 을 완료 하 라 고 알려 줍 니 다.현재 마우스 포인터 위 치 를 찾 아 단 추 를 해당 위치 로 이동 합 니 다.

e.setDropAction(Qt.MoveAction)
e.accept()
우 리 는 동작 을 배치 하 는 유형 을 지정 합 니 다.현재 상황 에서 그것 은 이동 동작 이다.
프로그램 실행 후

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기