124 lines
5.0 KiB
Python
124 lines
5.0 KiB
Python
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() |