フレームレスなウインドウをD&Dで動かす方法!!

takkun
どうも!たっくんです!
ちょっとは自炊できるようになりたい、、、なんて思うような思わないような心境です!

DragでWidgetを動かす方法!!」と「setWindowFlagsを使いこなす!!」を併用して、フレームレスなウインドウをD&Dで動かせる方法をご紹介したいと思います!(`・ω・´)ゞ

DragでWidgetを動かす方法!!

2017.11.09

setWindowFlagsを使いこなす!!

2017.12.04

クラスのベース

以前のクラスを元に、ウインドウ用に書き換えて準備をします。

from PySide import QtCore, QtGui
 
class DraggableWindow(QtGui.QMainWindow):
	def __init__(self, *args, **kwargs):
		super(DraggableWindow, self).__init__(*args, **kwargs)
		self.__isDrag = False
		self.__startPos = QtCore.QPoint(0, 0)
	 
	def mousePressEvent(self, event):
		self.__isDrag = True
		self.__startPos = event.pos()
		super(DraggableWindow, self).mousePressEvent(event)
	 
	def mouseReleaseEvent(self, event):
		self.__isDrag = False
		super(DraggableWindow, self).mouseReleaseEvent(event)
		 
	def mouseMoveEvent(self, event):
		if self.__isDrag:
			self.move(self.mapToParent(event.pos() - self.__startPos))
			 
		super(DraggableWindow, self).mouseMoveEvent(event)

フレームレスの設定を追加

__init__」で「setWindowFlags」を使って、「QtCore.Qt.FramelessWindowHint」を設定します。

from PySide import QtCore, QtGui
 
class DraggableWindow(QtGui.QMainWindow):
	def __init__(self, *args, **kwargs):
		super(DraggableWindow, self).__init__(*args, **kwargs)
		self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
		self.__isDrag = False
		self.__startPos = QtCore.QPoint(0, 0)
	 
	def mousePressEvent(self, event):
		self.__isDrag = True
		self.__startPos = event.pos()
		super(DraggableWindow, self).mousePressEvent(event)
	 
	def mouseReleaseEvent(self, event):
		self.__isDrag = False
		super(DraggableWindow, self).mouseReleaseEvent(event)
		 
	def mouseMoveEvent(self, event):
		if self.__isDrag:
			self.move(self.mapToParent(event.pos() - self.__startPos))
			 
		super(DraggableWindow, self).mouseMoveEvent(event)

実験!

ウインドウを作成して、実際に動かせるか試してみます!

ここではウインドウを閉じるためのロジックを作成していません!コードを書かないと閉じることができないためご注意ください。

閉じるボタンを追加

ウインドウにセットする中身をクラス「OptionWidget」で構成し、シグナル「closed」を作成し、ウインドウと関連付けられるようにしました。

ウインドウでは、Signalとウインドウを閉じるSlot「close」をコネクションします。

from PySide import QtCore, QtGui

class OptionWidget(QtGui.QWidget):
	closed = QtCore.Signal()
	
	def __init__(self, *args, **kwargs):
		super(OptionWidget, self).__init__(*args, **kwargs)
		
		mainLayout = QtGui.QVBoxLayout(self)
		
		button = QtGui.QPushButton('Close', self)
		button.clicked.connect(self.__close)
		mainLayout.addWidget(button)
		mainLayout.addStretch(True)
	
	def __close(self):
		self.closed.emit()
	
class DraggableWindow(QtGui.QMainWindow):
	def __init__(self, *args, **kwargs):
		super(DraggableWindow, self).__init__(*args, **kwargs)
		self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
		
		optionWidget = OptionWidget(self)
		optionWidget.closed.connect(self.close)
		self.setCentralWidget(optionWidget)
		
		self.__isDrag = False
		self.__startPos = QtCore.QPoint(0, 0)
	 
	def mousePressEvent(self, event):
		self.__isDrag = True
		self.__startPos = event.pos()
		super(DraggableWindow, self).mousePressEvent(event)
	 
	def mouseReleaseEvent(self, event):
		self.__isDrag = False
		super(DraggableWindow, self).mouseReleaseEvent(event)
		 
	def mouseMoveEvent(self, event):
		if self.__isDrag:
			self.move(self.mapToParent(event.pos() - self.__startPos))
			 
		super(DraggableWindow, self).mouseMoveEvent(event)

実験 part2!

ウインドウを作成して、実際に動かせてウインドウを閉じれるか試してみます!