detect-gui/main.py
2025-02-14 14:22:23 +08:00

203 lines
7.6 KiB
Python

import asyncio
import sys
from PyQt5.QtCore import Qt, QDate, QThread, QSize
from PyQt5.QtGui import QPixmap, QFontDatabase, QFont, QPainter, \
QLinearGradient, QColor, QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QStackedWidget, \
QFrame, QSpacerItem, QSizePolicy, QProgressBar, QRadioButton, QPushButton, QMessageBox
from core.edge_context import EdgeContext
from core.logging import logger
from core.context import AppContext
from util import load_stylesheet
from widget.device import DeviceWidget
from widget.task_list import TaskListFrame
class DetectWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ratio = AppContext.get_ratio()
# 电池状态
self.battery = 10
self.battery_state = 0
# 设置主窗口标题
self.setWindowTitle('预埋件检测系统')
# 创建主窗口的中央Widget
central_widget = QWidget()
self.setCentralWidget(central_widget)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) # 去掉窗口边框
# 创建主布局
main_layout = QVBoxLayout(central_widget)
main_layout.setContentsMargins(0, 0, 0, 0) # 设置边距为零
main_layout.setSpacing(0) # 设置间隔为零
# ---------- 顶部标题栏 ----------
header_widget = QWidget()
header_widget.setObjectName("headerWidget")
header_widget.setFixedHeight(int(self.ratio * 64))
header_layout = QHBoxLayout(header_widget)
header_layout.setContentsMargins(int(self.ratio * 20), 0, int(self.ratio * 20), 0)
header_layout.setSpacing(0)
# 左侧标题
header_left_widget = QWidget()
header_left_layout = QHBoxLayout(header_left_widget)
header_left_layout.setContentsMargins(0, 0, 0, 0) # 设置边距为零
header_left_layout.setSpacing(0) # 设置间隔为零
# logo
logo_label = QLabel()
pixmap = QPixmap("assets/logo.png")
scaled_pixmap = pixmap.scaled(int(self.ratio * 64) - 10, int(self.ratio * 64) - 10, Qt.KeepAspectRatio, Qt.SmoothTransformation)
logo_label.setPixmap(scaled_pixmap)
header_left_layout.addWidget(logo_label)
header_left_layout.addSpacing(int(self.ratio * 5))
# title
self.title_label = QLabel("预埋件检测系统")
self.title_label.setObjectName("titleLabel")
header_left_layout.addWidget(self.title_label)
header_layout.addWidget(header_left_widget, alignment=Qt.AlignLeft)
# 右侧日期和电量
header_right_widget = QWidget()
header_right_layout = QHBoxLayout(header_right_widget)
self.date_label = QLabel(QDate.currentDate().toString('yyyy年MM月dd日'))
self.date_label.setObjectName("dateLabel")
header_right_layout.addWidget(self.date_label)
header_right_layout.addSpacing(int(self.ratio * 10))
# 雷达
self.radar = QPushButton()
self.radar.setObjectName("radar-open")
self.radar.setIcon(QIcon("assets/radar-fill-red.png"))
self.radar.setIconSize(QSize(36, 36))
self.radar.setStyleSheet("background-color: transparent;")
self.radar.clicked.connect(self.radar_clicked)
header_right_layout.addWidget(self.radar)
header_left_layout.addSpacing(int(self.ratio * 10))
# 电量
self.batteryBar = QProgressBar(self)
self.batteryBar.setMinimum(0)
self.batteryBar.setMaximum(100)
self.batteryBar.setValue(self.battery)
# 充电图标
self.chargeIcon = QLabel(self)
self.chargeIcon.setPixmap(QPixmap("assets/icon_charging.png").scaled(24, 24, Qt.KeepAspectRatio, Qt.SmoothTransformation))
self.chargeIcon.setVisible(False)
# 设置电池显示样式
self.batteryBar.setAlignment(Qt.AlignCenter)
self.batteryBar.setFormat("%p%")
header_right_layout.addWidget(self.batteryBar)
header_right_layout.addWidget(self.chargeIcon)
header_layout.addWidget(header_right_widget, alignment=Qt.AlignRight)
# 添加标题栏
main_layout.addWidget(header_widget)
# 任务列表
task_list = TaskListFrame()
main_layout.addWidget(task_list)
# 信号
self.init_signals()
self.battery_change(self.battery)
# 设置窗口默认全屏
# self.resize(1024, 768)
self.showFullScreen()
# self.setWindowState(Qt.WindowMaximized)
#
def init_signals(self):
ups = AppContext.get_edge_context().get_component('ups')
ups.signals.battery_change.connect(self.battery_change)
ups.signals.state_change.connect(self.battery_state_change)
def radar_clicked(self):
gpio_manager = AppContext.get_edge_context().get_component('gpio')
if gpio_manager.lidar_value == -1:
return
elif gpio_manager.lidar_value == 0:
gpio_manager.close_lidar()
self.radar.setIcon(QIcon("assets/radar-fill-red.png"))
else:
gpio_manager.open_lidar()
self.radar.setIcon(QIcon("assets/radar-fill-green.png"))
#
def battery_change(self, battery):
"""更新电池电量"""
self.battery = battery
self.batteryBar.setValue(battery)
if self.battery < 20:
self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: red; border-radius: 3px;}")
elif self.battery < 50:
self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: yellow; border-radius: 3px;}")
else:
self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: #1afa29; border-radius: 3px;}")
def battery_state_change(self, battery_state):
"""更新充电状态"""
self.battery_state = battery_state
if self.battery_state & 0x08 == 0x08:
self.chargeIcon.setPixmap(QPixmap("assets/icon_charging.png").scaled(24, 24))
self.chargeIcon.setVisible(True)
elif self.battery_state & 0x04 == 0x04:
self.chargeIcon.setPixmap(QPixmap("assets/icon_charge_finish.png").scaled(24, 24))
self.chargeIcon.setVisible(True)
else:
self.chargeIcon.setVisible(False)
def showEvent(self, event):
super().showEvent(event)
def on_quit():
AppContext.get_edge_context().stop()
edge_worker.quit()
logger.info("Application quit.")
class EdgeContextWorker(QThread):
def __init__(self, context):
super().__init__()
self.edge_context = context
def run(self):
self.edge_context.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.aboutToQuit.connect(on_quit)
screen = app.primaryScreen()
dpi = screen.logicalDotsPerInch()
AppContext.set_ratio(dpi / 96.0)
stylesheet = load_stylesheet("styles/global.qss")
app.setStyleSheet(stylesheet)
# 加载自定义字体
font_id = QFontDatabase.addApplicationFont("assets/fonts/NotoSansSC-Regular.otf")
if font_id != -1:
font_family = QFontDatabase.applicationFontFamilies(font_id)[0]
custom_font = QFont(font_family, 14) # 使用字体族名创建字体,并设置大小
app.setFont(custom_font) # 设置全局字体
# 启动 EdgeContext 服务
edge_context = EdgeContext()
AppContext.set_edge_context(edge_context)
edge_worker = EdgeContextWorker(edge_context)
edge_worker.start()
window = DetectWindow()
window.setGeometry(0, 0, 1920, 1080)
window.setWindowIcon(QIcon("assets/logo.png"))
window.show()
AppContext.set_main_window(window)
sys.exit(app.exec_())