Можешь не мучиться. Я уже доработал:
def setMoveWindow(widget):
"""
Позволяет перемещать окно ухватившись не только за заголовок, а за произвольный виджит (widget).
"""
win = widget.window()
cursorShape = widget.cursor().shape()
moveSource = getattr(widget, "mouseMoveEvent")
pressSource = getattr(widget, "mousePressEvent")
releaseSource = getattr(widget, "mouseReleaseEvent")
def move(event):
if move.b_move:
x = event.globalX() + move.x_korr - move.lastPoint.x()
y = event.globalY() + move.y_korr - move.lastPoint.y()
win.move(x, y)
widget.setCursor(QtCore.Qt.SizeAllCursor)
return moveSource(event)
def press(event):
if event.button() == QtCore.Qt.LeftButton:
# Корекция геометрии окна: учитываем размеры рамки и заголовока
x_korr = win.frameGeometry().x() - win.geometry().x()
y_korr = win.frameGeometry().y() - win.geometry().y()
# Корекция геометрии виджита: учитываем смещение относительно окна
parent = widget
while not parent == win:
x_korr -= parent.x()
y_korr -= parent.y()
parent = parent.parent()
move.func_dict.update({"lastPoint":event.pos(), "b_move":True, "x_korr":x_korr, "y_korr":y_korr})
else:
move.func_dict.update({"b_move":False})
widget.setCursor(cursorShape)
return pressSource(event)
def release(event):
move.func_dict.update({"b_move":False})
widget.setCursor(cursorShape)
return releaseSource(event)
setattr(widget, "mouseMoveEvent", move)
setattr(widget, "mousePressEvent", press)
setattr(widget, "mouseReleaseEvent", release)
move.func_dict.update({"b_move":False})
return widget