| 61 | |
| 62 | |
| 63 | class WeltHideWindow(QWidget): |
| 64 | def __init__(self, *args, **kwargs): |
| 65 | super(WeltHideWindow, self).__init__(*args, **kwargs) |
| 66 | self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) |
| 67 | self.resize(400, 300) |
| 68 | self._width = QApplication.desktop().availableGeometry(self).width() |
| 69 | layout = QGridLayout(self) |
| 70 | layout.addItem( |
| 71 | QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 0, 0 |
| 72 | ) |
| 73 | self.closeBtn = QPushButton("X", self) |
| 74 | layout.addWidget(self.closeBtn, 0, 1) |
| 75 | layout.addItem( |
| 76 | QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), 1, 0 |
| 77 | ) |
| 78 | self.closeBtn.clicked.connect(self.close) |
| 79 | self.closeBtn.setMinimumSize(24, 24) |
| 80 | self.closeBtn.setMaximumSize(24, 24) |
| 81 | |
| 82 | def mousePressEvent(self, event): |
| 83 | """鼠标按下事件,需要记录下坐标self._pos 和 是否可移动self._canMove""" |
| 84 | super(WeltHideWindow, self).mousePressEvent(event) |
| 85 | if event.button() == Qt.LeftButton: |
| 86 | self._pos = event.globalPos() - self.pos() |
| 87 | # 当窗口最大化或者全屏时不可移动 |
| 88 | self._canMove = not self.isMaximized() or not self.isFullScreen() |
| 89 | |
| 90 | def mouseMoveEvent(self, event): |
| 91 | """鼠标移动事件,动态调整窗口位置""" |
| 92 | super(WeltHideWindow, self).mouseMoveEvent(event) |
| 93 | if event.buttons() == Qt.LeftButton and self._canMove: |
| 94 | self.move(event.globalPos() - self._pos) |
| 95 | |
| 96 | def mouseReleaseEvent(self, event): |
| 97 | """鼠标弹起事件,这个时候需要判断窗口的左边是否符合贴到左边,顶部,右边一半""" |
| 98 | super(WeltHideWindow, self).mouseReleaseEvent(event) |
| 99 | self._canMove = False |
| 100 | pos = self.pos() |
| 101 | x = pos.x() |
| 102 | y = pos.y() |
| 103 | if x < 0: |
| 104 | # 隐藏到左边 |
| 105 | return self.move(1 - self.width(), y) |
| 106 | if y < 0: |
| 107 | # 隐藏到顶部 |
| 108 | return self.move(x, 1 - self.height()) |
| 109 | if x > self._width - self.width() / 2: # 窗口进入右边一半距离 |
| 110 | # 隐藏到右边 |
| 111 | return self.move(self._width - 1, y) |
| 112 | |
| 113 | def enterEvent(self, event): |
| 114 | """鼠标进入窗口事件,用于弹出显示窗口""" |
| 115 | super(WeltHideWindow, self).enterEvent(event) |
| 116 | pos = self.pos() |
| 117 | x = pos.x() |
| 118 | y = pos.y() |
| 119 | if x < 0: |
| 120 | return self.move(0, y) |