有时为了制作工具条,或者其他特殊美化需求,需要把窗体的边框去掉,但是边框去掉后窗体无法移动。接下来解决如何移动去掉边框后的窗体。
说明:如果一个窗体去边框后,又设置了透明背景,那么窗体本身就不能监测鼠标事件进行移动了。解决方法之一:在合适的位置,放置一个label控件,并且设置背景色,用来向窗体传递鼠标移动事件。
1、具体操作
(1)窗体去边框:
self.setWindowFlags(Qt.FramelessWindowHint) # 去边框
(2)重写这3个方法:
mouseMoveEvent(self, e: QMouseEvent) # 重写鼠标移动事件,根据鼠标的轨迹,移动窗体。
mousePressEvent(self, e: QMouseEvent) # 重写鼠标点击事件
mouseReleaseEvent(self, e: QMouseEvent) # 重写鼠标释放事件
2、测试代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class TestWidget(QWidget):
def __init__(self):
super().__init__()
self._startPos = None
self._endPos = None
self._tracking = False
self.resize(240, 100)
# 窗体置顶(窗体置顶,仅仅为了方便测试),去边框
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
# 窗体透明,控件不透明
# self.setAttribute(Qt.WA_TranslucentBackground)
label = QLabel("我是一个窗体,但我没有边框!!!", self)
label.move(6, 6)
def mouseMoveEvent(self, e: QMouseEvent): # 重写移动事件
if self._tracking:
self._endPos = e.pos() - self._startPos
self.move(self.pos() + self._endPos)
def mousePressEvent(self, e: QMouseEvent):
if e.button() == Qt.LeftButton:
self._startPos = QPoint(e.x(), e.y())
self._tracking = True
def mouseReleaseEvent(self, e: QMouseEvent):
if e.button() == Qt.LeftButton:
self._tracking = False
self._startPos = None
self._endPos = None
if __name__ == "__main__":
app = QApplication(sys.argv)
game = TestWidget()
game.show()
sys.exit(app.exec_())
3、效果