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()
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()