You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
5.0 KiB
124 lines
5.0 KiB
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() |