PyQt 5 드래그 기능 구현
컴퓨터 그래 픽 사용자 인터페이스(GUI)에서 드래그 앤 드 롭 은 어떤 가상 대상 에서 클릭 하고 다른 위치 나 가상 대상 으로 드래그 하 는 동작 입 니 다.그것 은 보통 여러 동작 을 호출 하거나 두 추상 적 인 대상 에 게 관 계 를 만 드 는 데 사용 된다.
드래그 앤 드 롭 은 그래 픽 사용자 인터페이스의 일부분 입 니 다.드래그 앤 드 롭 은 사용자 로 하여 금 어떤 복잡 한 조작 을 직관 적 으로 완성 하 게 할 수 있다.
일반적으로 우 리 는 두 가지 사물 에 대해 드래그 앤 드 롭 작업 을 할 수 있다.데이터 나 특정한 도형 대상 이다.만약 우리 가 어떤 응용 프로그램의 그림 을 다른 응용 프로그램 에 끌 어 다 놓 으 면,우 리 는 바 이 너 리 데 이 터 를 끌 어 다 놓 습 니 다.Firefox 의 탭 을 다른 곳 에 끌 어 다 놓 으 면 그림 구성 요 소 를 끌 어 다 놓 습 니 다.
간단 한 드래그 앤 드 롭
첫 번 째 예제 에 서 는 QLine Edit 와 QPushButton 을 만 들 고 LineEdit 의 텍스트 를 단추 에 끌 어 다 놓 아 단추 의 탭 을 바 꾸 려 고 합 니 다.
import sys
from PyQt5.QtWidgets import (QPushButton, QWidget, QLineEdit, QApplication)
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("Button", self)
button.move(190, 65)
self.setWindowTitle("Simple drag & drop")
self.setGeometry(300, 300, 300, 150)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
이 예 는 간단 한 드래그 동작 을 보 여 주 었 다.
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True)
우 리 는 QPushButton 이 드래그 앤 드 롭 작업 을 받 아들 일 수 있 도록 어떤 방법 을 다시 실현 해 야 한다.그래서 우 리 는 QPushButton 을 계승 하 는 Button 류 를 만 들 었 다.
self.setAcceptDrops(True)
이 컨트롤 을 drop(내 려 놓 기)이 벤트 를 받 아들 입 니 다.
def dragEnterEvent(self, e):
if e.mimeData().hasFormat('text/plain'):
e.accept()
else:
e.ignore()
우선 dragEnterEvent()방법 을 다시 실현 하고 받 아들 일 수 있 는 데이터 형식 을 설정 합 니 다(여기 서 일반 텍스트 입 니 다).
def dropEvent(self, e):
self.setText(e.mimeData().text())
dropEvent()방법 을 다시 실현 함으로써 drop 이벤트 가 발생 했 을 때의 행 위 를 정의 합 니 다.여기 서 우 리 는 단추 의 문 자 를 바 꾸 었 다.
edit = QLineEdit('', self)
edit.setDragEnabled(True)
QLine Edit 에는 drag(드래그)동작 에 대한 지원 이 내장 되 어 있 습 니 다.우 리 는 setDragEnabled()방법 만 호출 하면 된다.단추 끌 어 다 놓 기
다음 예제 에서 단추 컨트롤 을 끌 어 다 놓 는 방법 을 보 여 줍 니 다.
import sys
from PyQt5.QtWidgets import QPushButton, QWidget, QApplication
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())
dropAcion = 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("Button", self)
self.button.move(100, 65)
self.setWindowTitle("Click or Move")
self.setGeometry(300, 300, 280, 150)
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()
app.exec_()
우 리 는 창 에 QPushButton 을 만 들 었 다.마우스 왼쪽 단 추 를 누 르 면 콘 솔 에서'press'메 시 지 를 출력 합 니 다.우 리 는 이 버튼 에서 드래그 동작 을 실 현 했 으 며 마우스 우 클릭 으로 드래그 할 수 있 습 니 다.
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
우 리 는 QPushButton 에서 Button 류 를 파생 시 켰 고 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 기반 드래그 앤 드 롭 데이터 전송 을 지원 합 니 다.
dropAction = drag.exec_(Qt.MoveAction)
Drag 대상 의 exec ()방법 은 드래그 앤 드 롭 작업 을 시작 하 는 데 사 용 됩 니 다.
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()방법 에서 우 리 는 마 우 스 를 놓 은 후의 조작 을 인 코딩 하고 drop 작업 을 완성 해 야 합 니 다.마우스 포인터 의 현재 위 치 를 찾 아 단 추 를 이동 하 는 것 이다.
e.setDropAction(Qt.MoveAction)
e.accept()
우 리 는 drop 동작의 유형 을 정의 했다.여 기 는 move 동작 입 니 다.이 튜 토리 얼 은 드래그 앤 드 롭 작업 을 설명 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt Designer와 PyQt5로 GUI인 MQTT 구독자를 만들 때의 메모직장의 건물이 신축되었으므로, 각 층의 분전반에 전력계를 설치해, 1곳에서 모니터링할 수 있는 시스템을 구축하려고 생각했다. 전력계는 을 참고로 제작했다. 시스템의 전체도 Windows10상에, 선인의 지혜를 참고로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.