Verslepen en loslaten

Op deze pagina:

In het engels heet dit drag and drop. Hier een voorbeeld waarbij tekst naar de knop gesleept kan worden, de tekst op de knop veranderd dan naar de gesleepte tekst. Je kunt tekst slepen die je in het invoerveld hebt ingetypt, maar ook tekst uit een ander programma kun je slepen en loslaten op de knop.



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

import sys

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

class Button(QPushButton):

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

        self.setAcceptDrops(True)

    def dragEnterEvent(self, e):

        # via text/plain kun je alleen tekst slepen, geen afbeeldingen
        if e.mimeData().hasFormat('text/plain'):
            e.accept()
        else:
            e.ignore()

    def dropEvent(self, e):
        self.setText(e.mimeData().text())

class Venster(QWidget):

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

        self.initUI()

    def initUI(self):

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

        button = Button("Knop", self)
        button.move(220, 65)

        self.setWindowTitle('Verslepen en loslaten')
        self.setGeometry(400, 400, 400, 160)

def main():

    app = QApplication(sys.argv)
    window = Venster()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main() 

drag n drop

drag n drop

Een knop verslepen

Nu een voorbeeld waarbij een knop versleept kan worden met de rechtermuisknop, als je met links klikt op de knop dan wordt de tekst "geklikt" afgedrukt in de terminal.


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

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

class Button(QPushButton):

    def __init__(self, title, parent):
        super(Button, self).__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.start(Qt.MoveAction)

    def mousePressEvent(self, e):

        super(Button, self).mousePressEvent(e)

        if e.button() == Qt.LeftButton:
            print ('geklikt')

class Venster(QWidget):

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

        self.initUI()

    def initUI(self):

        self.setAcceptDrops(True)

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

        self.setWindowTitle('Klikken of verschuiven')
        self.setGeometry(400, 400, 320, 160)
        self.show()

    def dragEnterEvent(self, e):

        e.accept()

    def dropEvent(self, e):

        position = e.pos()
        print(position)
        self.button.move(position)

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

def main():

    app = QApplication([])
    window = Venster()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main() 

drag n drop

 

Verwante artikelen