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 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 TaskListWidget class DetectWindow(QMainWindow): def __init__(self): super().__init__() self.ratio = AppContext.get_ratio() # 电池状态 self.battery = 40 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) - 4, int(self.ratio * 64) - 4, True) 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.setStyleSheet(f"color: white;font-size: {int(self.ratio * 24)}px;") 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.setStyleSheet(f"color: #898AC5;font-size: {int(self.ratio * 14)}px;") 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: rgb(255, 255, 255, 0);") self.radar.clicked.connect(self.radar_clicked) header_right_layout.addWidget(self.radar) header_left_layout.addSpacing(int(self.ratio * 10)) # 充电图标 self.chargeIcon = QLabel(self) self.chargeIcon.setPixmap(QPixmap("assets/icon_charge_finish.png").scaled(36, 36)) self.chargeIcon.setVisible(False) # 电量 self.batteryBar = QProgressBar(self) self.batteryBar.setMinimum(0) self.batteryBar.setMaximum(100) self.batteryBar.setValue(self.battery) self.batteryBar.setFixedHeight(int(self.ratio * 24)) self.batteryBar.setFixedWidth(int(self.ratio * 64)) # 设置电池显示样式 self.batteryBar.setAlignment(Qt.AlignCenter) self.batteryBar.setFormat("%p%") self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: #1afa29; }") header_right_layout.addWidget(self.chargeIcon) header_right_layout.addWidget(self.batteryBar) header_layout.addWidget(header_right_widget, alignment=Qt.AlignRight) # 添加标题栏 main_layout.addWidget(header_widget) # 任务列表 task_list_content = TaskListWidget() task_list_content.setObjectName("taskListWidget") task_list_content.setStyleSheet("background-color: #161B3B") main_layout.addWidget(task_list_content) # 信号 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; }") elif self.battery < 50: self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: yellow; }") else: self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: #1afa29; }") 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(36, 36)) self.chargeIcon.setVisible(True) elif self.battery_state & 0x04 == 0x04: self.chargeIcon.setPixmap(QPixmap("assets/icon_charge_finish.png").scaled(36, 36)) 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.show() sys.exit(app.exec_())