detect-gui/main.py

204 lines
7.8 KiB
Python
Raw Normal View History

2024-11-21 11:39:52 +08:00
import asyncio
import sys
2024-11-25 11:58:46 +08:00
from PyQt5.QtCore import Qt, QDate, QThread, QSize
2024-11-21 11:39:52 +08:00
from PyQt5.QtGui import QPixmap, QFontDatabase, QFont, QPainter, \
2024-11-25 11:58:46 +08:00
QLinearGradient, QColor, QIcon
2024-11-21 11:39:52 +08:00
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QStackedWidget, \
2024-11-25 14:49:03 +08:00
QFrame, QSpacerItem, QSizePolicy, QProgressBar, QRadioButton, QPushButton, QMessageBox
2024-11-21 11:39:52 +08:00
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)
2024-11-25 11:58:46 +08:00
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) # 去掉窗口边框
2024-11-21 11:39:52 +08:00
# 创建主布局
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))
2024-11-25 11:58:46 +08:00
# 雷达
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))
2024-11-21 11:39:52 +08:00
# 充电图标
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)
# 设置窗口默认全屏
2024-11-21 16:29:40 +08:00
# self.resize(1024, 768)
2024-11-21 11:39:52 +08:00
# self.showFullScreen()
2024-11-21 16:29:40 +08:00
self.setWindowState(Qt.WindowMaximized)
2024-11-21 11:39:52 +08:00
#
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)
2024-11-25 11:58:46 +08:00
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"))
2024-11-21 11:39:52 +08:00
#
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()
2024-11-25 11:58:46 +08:00
window.setGeometry(0, 0, 1920, 1080)
2024-11-21 11:39:52 +08:00
window.show()
sys.exit(app.exec_())