from PyQt6.QtWidgets import QMainWindow, QVBoxLayout, QWidget, QPushButton, QGraphicsDropShadowEffect from PyQt6.QtCore import Qt, pyqtSignal, QPoint from PyQt6.QtGui import QMouseEvent, QColor import time class IconWindow(QMainWindow): """Окно с круглой иконкой приложения""" icon_clicked = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) self.parent = parent self.dragging = False self.drag_offset = QPoint() self.setup_ui() def setup_ui(self): """Настраивает интерфейс иконки""" self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint | Qt.WindowType.Tool) self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) self.setFixedSize(70, 70) self.moved = False self.start_position = None self.icon_widget = QWidget() self.icon_layout = QVBoxLayout(self.icon_widget) self.icon_layout.setContentsMargins(10, 10, 10, 10) self.icon_button = QPushButton("P") self.icon_button.setFixedSize(50, 50) self.icon_button.setStyleSheet(""" QPushButton { background-color: rgba(30, 30, 30, 220); border-radius: 25px; color: white; font-size: 22px; font-weight: bold; border: 4px solid #8e44ad; } QPushButton:hover { background-color: rgba(0, 0, 0, 100); } QPushButton:pressed { background-color: rgba(0, 0, 0, 100); } """) self.icon_layout.addWidget(self.icon_button) # self.shadow = QGraphicsDropShadowEffect() # self.shadow.setBlurRadius(15) # self.shadow.setColor(QColor('#FFFFFF')) # self.shadow.setOffset(0, 0) # self.icon_widget.setGraphicsEffect(self.shadow) self.setCentralWidget(self.icon_widget) # Настраиваем обработчики мыши для перемещения self.icon_button.mousePressEvent = self.mouse_press_event self.icon_button.mouseMoveEvent = self.mouse_move_event self.icon_button.mouseReleaseEvent = self.mouse_release_event def mouse_press_event(self, event: QMouseEvent): """Обработчик нажатия мыши на иконку""" if event.button() == Qt.MouseButton.LeftButton: self.moved = True self.start_position = self.icon_button.mapToGlobal(event.position().toPoint()) self.dragging = True self.drag_offset = event.position().toPoint() self.icon_button.setStyleSheet(""" QPushButton { background-color: rgba(0, 0, 0, 220); border-radius: 25px; color: white; font-size: 22px; font-weight: bold; border: 3px solid #8e44ad; } """) # self.shadow.setColor(QColor('#de94fd')) event.accept() def mouse_move_event(self, event: QMouseEvent): """Обработчик движения мыши для иконки""" if self.dragging and event.buttons() & Qt.MouseButton.LeftButton: global_pos = self.icon_button.mapToGlobal(event.position().toPoint()) new_pos = global_pos - self.drag_offset + QPoint(-10,-10) self.move(new_pos) event.accept() def mouse_release_event(self, event: QMouseEvent): """Обработчик отпускания мыши для иконки""" if event.button() == Qt.MouseButton.LeftButton and self.dragging: # Решение конфликта событий mouse_press_event и clicked end_position = self.icon_button.mapToGlobal(event.position().toPoint()) if abs((self.start_position - end_position).x()) + abs((self.start_position - end_position).y()) < 40: self.icon_clicked.emit() self.dragging = False self.icon_button.setStyleSheet(""" QPushButton { background-color: rgba(30, 30, 30, 220); border-radius: 25px; color: white; font-size: 22px; font-weight: bold; border: 4px solid #8e44ad; } QPushButton:hover { background-color: rgba(0, 0, 0, 100); } """) # self.shadow.setColor(QColor('#FFFFFF')) event.accept() def show_icon(self): """Показывает иконку в левом нижнем углу""" screen_geometry = self.screen().geometry() x_position = screen_geometry.width() - 70 y_position = screen_geometry.height() - 120 self.move(x_position, y_position) self.show()