import sys from PyQt5.Qt import * class Window(QWidget): def __init__(self): super().__init__() # 按钮宽,高,距离顶部距离 self.max_min_close_button_size = [45, 25, 0] self.setup_ui() def setup_ui(self): self.setWindowTitle("Qt桌面应用程序") # 窗口无边框 self.setWindowFlag(Qt.FramelessWindowHint) # 窗口不透明度 self.setWindowOpacity(0.8) self.resize(300, 300) self.add_max_min_close_button() self.max_min_close_button_func() # 定义最小化、最大化、关闭按钮内容、尺寸 def add_max_min_close_button(self): self.close_button = QPushButton(self) self.close_button.setText("关闭") self.close_button.resize(self.max_min_close_button_size[0], self.max_min_close_button_size[1]) self.max_button = QPushButton(self) self.max_button.setText("最大化") self.max_button.resize(self.max_min_close_button_size[0], self.max_min_close_button_size[1]) self.min_button = QPushButton(self) self.min_button.setText("最小化") self.min_button.resize(self.max_min_close_button_size[0], self.max_min_close_button_size[1]) # 重写窗口尺寸变化事件处理方法,重新设定按钮位置 def resizeEvent(self, a0) -> None: self.close_button_position_x = self.width() - self.max_min_close_button_size[0] self.close_button_position_y = self.max_min_close_button_size[2] self.close_button.move(self.close_button_position_x, self.close_button_position_y) self.max_button_position_x = self.close_button_position_x - self.max_min_close_button_size[0] self.max_button_position_y = self.max_min_close_button_size[2] self.max_button.move(self.max_button_position_x, self.max_button_position_y) self.min_button_position_x = self.max_button_position_x - self.max_min_close_button_size[0] self.min_button_position_y = self.max_min_close_button_size[2] self.min_button.move(self.min_button_position_x, self.min_button_position_y) # 重写鼠标按下事件处理方法,鼠标左键按下时获取鼠标和窗口初始位置 def mousePressEvent(self, a0) -> None: if a0.button() == Qt.LeftButton: # 鼠标左键按下标志 self.left_button_press_flag = True self.window_initial_position = [self.x(), self.y()] self.mouse_initial_position = [a0.globalX(), a0.globalY()] # 重写鼠标移动事件处理方法,鼠标左键按下移动时重新设置窗口的位置 def mouseMoveEvent(self, a0) -> None: if self.left_button_press_flag: mouse_current_position = [a0.globalX(), a0.globalY()] mouse_move_distance = [mouse_current_position[0] - self.mouse_initial_position[0], mouse_current_position[1] - self.mouse_initial_position[1]] window_current_position = [self.window_initial_position[0] + mouse_move_distance[0], self.window_initial_position[1] + mouse_move_distance[1]] self.move(window_current_position[0], window_current_position[1]) # 重写鼠标松开事件处理方法,鼠标左键松开时重置鼠标左键按下标志 def mouseReleaseEvent(self, a0) -> None: # if self.left_button_press_flag: self.left_button_press_flag = False # 定义按键功能方法 def max_min_close_button_func(self): def window_close(): self.close() self.close_button.clicked.connect(window_close) def window_maximum(): if self.isMaximized(): self.showNormal() self.max_button.setText("最大化") else: self.showMaximized() self.max_button.setText("恢复") self.max_button.clicked.connect(window_maximum) def window_minimum(): self.showMinimized() self.min_button.clicked.connect(window_minimum) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())