from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from threading import *
import time
class MovingButton(QPushButton):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.parentWindow = args[1]
self.pressed = False
def thread(self):
t = Thread(target=self.updateCoordinates)
t.start()
def updateCoordinates(self):
while self.pressed:
x,y,w,h = self.geometry().getRect()
new_x = QCursor.pos().x() - self.parentWindow.geometry().getRect()[0]
new_y = QCursor.pos().y() - self.parentWindow.geometry().getRect()[1]
x = new_x - w//2
y = new_y - h//2
self.setGeometry(x, y, w, h)
time.sleep(0.01)
def mousePressEvent(self, event):
self.pressed = True
self.thread()
def mouseReleaseEvent(self, event):
self.pressed = False
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Window")
self.setMouseTracking(True)
self.setGeometry(200, 20, 800, 800)
self.label = QLabel('label', self)
self.label.setGeometry(500, 500, 30, 50)
self.button = MovingButton('button', self)
self.button.setGeometry(200, 300, 40, 50)
self.show()
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
W sumie za pomocą atrybutu setGeometry
można ustawiać położenie, x,y i szerokość wysokość elementu, dowolnie po surfacie można latać elementami jak się chce.