Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2015 14:56:42

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

pyqt изменить форму окна

Хочу задать окну какую-то произвольную форму, проблема только в том, что если делать как описано в книге Прохоренка, то окно не получается перемещать, а мне нужно иметь возможность перемещать окно. Подскажите как сделать?

Офлайн

#2 Март 24, 2015 19:48:49

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

pyqt изменить форму окна

Вот человек почти готовое решение предложит. Осталось его доработать напильником.

http://www.forum.crossplatform.ru/index.php?s=&showtopic=4955&view=findpost&p=34539



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Март 25, 2015 18:54:15

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

pyqt изменить форму окна

Можешь не мучиться. Я уже доработал:

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 27, 2015 10:28:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version