mirror of
http://git.xinwangdao.com/cnnc-embedded-parts-detect/detect-gui.git
synced 2025-06-23 20:54:13 +08:00
203 lines
7.6 KiB
Python
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_())
|