「DragでWidgetを動かす方法!!」と「setWindowFlagsを使いこなす!!」を併用して、フレームレスなウインドウをD&Dで動かせる方法をご紹介したいと思います!(`・ω・´)ゞ
クラスのベース
以前のクラスを元に、ウインドウ用に書き換えて準備をします。
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!
ウインドウを作成して、実際に動かせてウインドウを閉じれるか試してみます!
ちょっとは自炊できるようになりたい、、、なんて思うような思わないような心境です!