PyQt5チュートリアル「ドラッグアンドドロップ」

 

ディレクトリ

 

PyQt5でドラッグアンドドロップ

QDrag

シンプルなドラッグアンドドロップ

ドラッグアンドドロップボタンウィジェット


PyQt5でドラッグアンドドロップ

PyQt5チュートリアルのこのパートでは、ドラッグアンドドロップ操作について説明します。

コンピューターのグラフィカルユーザーインターフェイスでは、ドラッグアンドドロップは、仮想オブジェクトをクリックして別の場所または別の仮想オブジェクトにドラッグする(またはその操作をサポートする)動作です。一般に、複数の操作を呼び出したり、2つの抽象オブジェクト間にさまざまなタイプの関連付けを作成したりするために使用できます。

ドラッグアンドドロップは、グラフィカルユーザーインターフェイスの一部です。ドラッグアンドドロップ操作により、ユーザーは複雑な操作を直感的に実行できます。

通常、データとグラフィックオブジェクトの2つをドラッグアンドドロップできます。あるアプリケーションから別のアプリケーションに画像をドラッグする場合、バイナリデータをドラッグアンドドロップします。Firefoxでラベルをドラッグして別の場所に移動すると、グラフィカルコンポーネントがドラッグアンドドロップされます。

QDrag

QDragMIMEベースのドラッグアンドドロップデータ転送のサポートを提供します。ドラッグアンドドロップ操作の詳細のほとんどを処理します。転送されたデータは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つのメソッドを再実装しましたQPushButtonmouseMoveEvent()および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()この例では、これは移動アクションです。

 

元の記事を59件公開 賞賛を69件 270,000回以上の閲覧

おすすめ

転載: blog.csdn.net/pansaky/article/details/98873595