ディレクトリ
PyQt5でドラッグアンドドロップ
PyQt5チュートリアルのこのパートでは、ドラッグアンドドロップ操作について説明します。
コンピューターのグラフィカルユーザーインターフェイスでは、ドラッグアンドドロップは、仮想オブジェクトをクリックして別の場所または別の仮想オブジェクトにドラッグする(またはその操作をサポートする)動作です。一般に、複数の操作を呼び出したり、2つの抽象オブジェクト間にさまざまなタイプの関連付けを作成したりするために使用できます。
ドラッグアンドドロップは、グラフィカルユーザーインターフェイスの一部です。ドラッグアンドドロップ操作により、ユーザーは複雑な操作を直感的に実行できます。
通常、データとグラフィックオブジェクトの2つをドラッグアンドドロップできます。あるアプリケーションから別のアプリケーションに画像をドラッグする場合、バイナリデータをドラッグアンドドロップします。Firefoxでラベルをドラッグして別の場所に移動すると、グラフィカルコンポーネントがドラッグアンドドロップされます。
QDrag
QDrag
MIMEベースのドラッグアンドドロップデータ転送のサポートを提供します。ドラッグアンドドロップ操作の詳細のほとんどを処理します。転送されたデータはQMimeData
オブジェクトに含まれています。
シンプルなドラッグアンドドロップ
最初の例では、one QLineEdit
とoneがあり QPushButton
ます。プレーンテキストをライン編集ウィジェットからドラッグし、ボタンウィジェットにドロップします。ボタンのラベルが変わります。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import (QPushButton, QWidget,
QLineEdit, QApplication)
import sys
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 and drop')
self.setGeometry(300, 300, 300, 150)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()
この例では、単純なドラッグアンドドロップ操作を提供します。
class Button(QPushButton):
def __init __(self,title,parent):
super().__ init __(title,parent)
...
QPushButton
ウィジェットのテキストを削除するには、いくつかのメソッドを再実装する必要があります。したがって、Button
クラスから継承する独自のクラスを作成しますQPushButton
。
self.setAcceptDrops(True)
ウィジェットのドロップイベントを有効にしましたsetAcceptDrops()
。
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()
メソッドを再実装することにより、ドロップイベントに何が起こるかを定義します。ここでは、ボタンウィジェットのテキストを変更します。
edit = QLineEdit('', self)
edit.setDragEnabled(True)
QLineEdit
ウィジェットが組み込まれており、ドラッグ操作のサポート。必要なのは、setDragEnabled()
メソッドを呼び出してアクティブにすることだけです。
図:単純なドラッグアンドドロップ
ドラッグアンドドロップボタンウィジェット
以下の例では、ボタンウィジェットをドラッグアンドドロップする方法を示します。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QPushButton, QWidget, QApplication
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag
import sys
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())
dropAction = drag.exec_(Qt.MoveAction)
def mousePressEvent(self, e):
super().mousePressEvent(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
、ウィンドウに1つあります。マウスの左ボタンでボタンをクリックすると、「プレス」メッセージがコンソールに出力されます。ボタンを右クリックして移動することにより、ボタンウィジェットでドラッグアンドドロップ操作を実行します。
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
Button
派生クラスを作成しましたQPushButton
。また、2つのメソッドを再実装しましたQPushButton
:mouseMoveEvent()
およびmousePressEvent()
。このmouseMoveEvent()
メソッドは、ドラッグアンドドロップ操作が始まる場所です。
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)
exec_()
オブジェクトをドラッグして、ドラッグアンドドロップ操作を開始します。
def mousePressEvent(self, e):
super().mousePressEvent(e)
if e.button() == Qt.LeftButton:
print('press')
マウスの左ボタンでボタンをクリックすると、「プレス」がコンソールに出力されます。mousePressEvent()
親のメソッドも呼び出すことに注意してください。そうしないと、ボタンが押されているのが見えません。
position = e.pos()
self.button.move(position)
このdropEvent()
メソッドでは、マウスボタンを離して配置操作が完了したときの動作を指定します。この例では、現在のマウスポインターの位置を見つけ、それに応じてボタンを移動します。
e.setDropAction(Qt.MoveAction)
e.accept()
指定されたタイプの配置操作を使用しますsetDropAction()
。この例では、これは移動アクションです。