diff --git a/assets/error.png b/assets/error.png new file mode 100644 index 0000000..847d390 Binary files /dev/null and b/assets/error.png differ diff --git a/assets/info.png b/assets/info.png new file mode 100644 index 0000000..4b984f9 Binary files /dev/null and b/assets/info.png differ diff --git a/assets/logo.png b/assets/logo.png index 3146a8e..a7b5c82 100644 Binary files a/assets/logo.png and b/assets/logo.png differ diff --git a/assets/radar-fill-green.png b/assets/radar-fill-green.png index 9bd2dcb..550e04a 100644 Binary files a/assets/radar-fill-green.png and b/assets/radar-fill-green.png differ diff --git a/assets/radar-fill-red.png b/assets/radar-fill-red.png index 69fc410..bad5e6d 100644 Binary files a/assets/radar-fill-red.png and b/assets/radar-fill-red.png differ diff --git a/assets/run.png b/assets/run.png new file mode 100644 index 0000000..8aaf23d Binary files /dev/null and b/assets/run.png differ diff --git a/assets/success.png b/assets/success.png new file mode 100644 index 0000000..9ae2ffa Binary files /dev/null and b/assets/success.png differ diff --git a/assets/warning.png b/assets/warning.png new file mode 100644 index 0000000..11af30e Binary files /dev/null and b/assets/warning.png differ diff --git a/components/dat_task.py b/components/dat_task.py index b6accd4..fd18eee 100644 --- a/components/dat_task.py +++ b/components/dat_task.py @@ -97,7 +97,7 @@ class TaskTable(EdgeComponent): try: conn = sqlite3.connect(self.db_path) cursor = conn.cursor() - cursor.execute("SELECT * FROM dat_task WHERE state <= ? order by create_time", (state,)) + cursor.execute("SELECT * FROM dat_task WHERE state <= ? order by create_time desc", (state,)) l = cursor.fetchall() except Exception as e: pass diff --git a/core/context.py b/core/context.py index 8ecb36d..aa330ef 100644 --- a/core/context.py +++ b/core/context.py @@ -1,3 +1,4 @@ +from PyQt5.QtWidgets import QMainWindow class AppContext: @@ -8,6 +9,8 @@ class AppContext: _display_ratio = 1 # EdgeContext _edge_context = None + # 主窗口 + _main_window: QMainWindow = None @staticmethod def set_ratio(ratio): @@ -23,4 +26,12 @@ class AppContext: @staticmethod def get_edge_context(): - return AppContext._edge_context \ No newline at end of file + return AppContext._edge_context + + @staticmethod + def set_main_window(win): + AppContext._main_window = win + + @staticmethod + def get_main_window(): + return AppContext._main_window diff --git a/core/edge_context.py b/core/edge_context.py index a332be0..32d88a4 100644 --- a/core/edge_context.py +++ b/core/edge_context.py @@ -301,7 +301,7 @@ class EdgeContext(LoggingMixin): self.tcp_clients.add(writer) # 添加客户端连接 try: while True: - data = await reader.read(4096) + data = await reader.read(8192) if not data: break diff --git a/main.py b/main.py index c337607..06a76a7 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,7 @@ 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 +from widget.task_list import TaskListFrame class DetectWindow(QMainWindow): def __init__(self): @@ -20,7 +20,7 @@ class DetectWindow(QMainWindow): self.ratio = AppContext.get_ratio() # 电池状态 - self.battery = 40 + self.battery = 10 self.battery_state = 0 # 设置主窗口标题 @@ -50,20 +50,21 @@ class DetectWindow(QMainWindow): # logo logo_label = QLabel() pixmap = QPixmap("assets/logo.png") - scaled_pixmap = pixmap.scaled(int(self.ratio * 64) - 4, int(self.ratio * 64) - 4, True) + 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.setStyleSheet(f"color: white;font-size: {int(self.ratio * 24)}px;") + 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.setStyleSheet(f"color: #898AC5;font-size: {int(self.ratio * 14)}px;") + self.date_label.setObjectName("dateLabel") + header_right_layout.addWidget(self.date_label) header_right_layout.addSpacing(int(self.ratio * 10)) @@ -72,37 +73,32 @@ class DetectWindow(QMainWindow): 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.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.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.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%") - self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: #1afa29; }") - header_right_layout.addWidget(self.chargeIcon) 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_content = TaskListWidget() - task_list_content.setObjectName("taskListWidget") - task_list_content.setStyleSheet("background-color: #161B3B") - main_layout.addWidget(task_list_content) + task_list = TaskListFrame() + main_layout.addWidget(task_list) # 信号 self.init_signals() @@ -110,8 +106,8 @@ class DetectWindow(QMainWindow): # 设置窗口默认全屏 # self.resize(1024, 768) - # self.showFullScreen() - self.setWindowState(Qt.WindowMaximized) + self.showFullScreen() + # self.setWindowState(Qt.WindowMaximized) # def init_signals(self): @@ -136,20 +132,20 @@ class DetectWindow(QMainWindow): self.battery = battery self.batteryBar.setValue(battery) if self.battery < 20: - self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: red; }") + self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: red; border-radius: 3px;}") elif self.battery < 50: - self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: yellow; }") + self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: yellow; border-radius: 3px;}") else: - self.batteryBar.setStyleSheet("QProgressBar::chunk { background-color: #1afa29; }") + 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(36, 36)) + 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(36, 36)) + self.chargeIcon.setPixmap(QPixmap("assets/icon_charge_finish.png").scaled(24, 24)) self.chargeIcon.setVisible(True) else: self.chargeIcon.setVisible(False) @@ -198,6 +194,9 @@ if __name__ == '__main__': 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_()) diff --git a/styles/global.qss b/styles/global.qss index f87f99d..b30735e 100644 --- a/styles/global.qss +++ b/styles/global.qss @@ -6,83 +6,62 @@ QLabel { color: #D9E1E7; background-color: transparent; border: 0 solid transparent; -} - -MenuButton { - background-color: transparent; -} - -QWidget#menuWidget { - background-color: #1E244D; + font-size: 16px; } QWidget#headerWidget { - background-color: #2A2F55; + background-color: #222644; } -TaskListWidget QLabel, -TaskListWidget QPlainTextEdit { +QLabel#titleLabel { + font-size: 24px; + font-weight: bold; +} + +QLabel#dateLabel { font-size: 14px; } -TaskListWidget QLabel#THeader { - font-size: 16px; - font-weight: bold; -} -TaskListWidget QPushButton { - color: #D9E1E7; - border-radius: 8px; - font-size: 16px; -} - -QPushButton { - color: #D9E1E7; - border-radius: 8px; - background-color: #3A36DB; -} - -QPushButton::disabled { - color: #999999; - background-color: rgba(58,54,219,0.4); -} - -QLineEdit { - color: #D9E1E7; - border: 1px solid #D9E1E7; - border-radius: 8px; - padding: 3 10; - background-color: transparent; -} - -QWidget#jsonWidget { - border: 1px solid #D9E1E7; - border-radius: 8px; -} - -QPlainTextEdit { - color: #D9E1E7; +QProgressBar { + color: #6a6d88; + font-size: 14px; + text-align: center; + background-color: #ffffff; border: none; - border: 1px solid #D9E1E7; - background-color: transparent; + height: 20px; + width: 60px; + border-radius: 3px; } -QAbstractScrollArea#mapArea { - border: none; - background: transparent; - border: 1px solid #D9E1E7; +QProgressBar::chunk { + background-color: #05B8CC; + border-radius: 3px; } -QAbstractScrollArea QWidget { - border: none; - background: transparent; +QCommandLinkButton { + font-family: 'Noto Sans SC'; + font-size: 14px; + font-weight: normal; + color: #ffffff; + max-width: 60px; +} + +QScrollArea#taskArea { + border: None; + border-radius: 0; +} + +QScrollArea#paramArea { + border: 1px solid #ffffff; + border-radius: 0; } /* === QScrollBar:horizontal === */ QScrollBar:horizontal { background: rgba(58,54,219,0.45); - height: 5px; - margin: 0px; - border-radius: 2px; + height: 8px; + margin: 0; + border-radius: 0; } QScrollBar::handle:horizontal { @@ -106,15 +85,15 @@ QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { /* === QScrollBar:vertical === */ QScrollBar:vertical { background: rgba(58,54,219,0.45); - width: 5px; - margin: 0px; - border-radius: 2px; + width: 8px; + margin: 0; + border-radius: 0; } QScrollBar::handle:vertical { - background: rgba(58,54,219,0.9); + background: #555977; min-height: 20px; - border-radius: 2px; + border-radius: 0; } QScrollBar::add-line:vertical { @@ -127,168 +106,134 @@ QScrollBar::sub-line:vertical { QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; -} - -TaskRunDialog { - background-color: #161B3B; -} - -QWidget#viewWidget { - background-color: #222222; -} - -QPushButton#stopTaskButton { - background-color: #FF4444; -} - -EmbedItem QLabel { - color: #999999; - font-size: 10px; - font-weight: bold; - border: 1px solid transparent; -} - -EmbedItem QPushButton { - border: 1px solid #999999; - border-radius: 0; - font-size: 10px; - font-weight: bold; -} - -EmbedItem QPushButton#STD { - border: 1px solid transparent; - background-color: #FF4444; -} - -QWidget#checkWidget, -QWidget#viewCheckWidget { - border: 0px dashed #6cff6c; -} - -QWidget#legendCheckWidget { - width: 20px; - min-width: 20px; - max-width: 20px; - height: 20px; - min-height: 20px; - max-height: 20px; - border: 1px dashed #6cff6c; -} - -QWidget#legendCheckLabel { - color: #6cff6c; -} - -QWidget#legendStdWidget { - width: 20px; - min-width: 20px; - max-width: 20px; - height: 20px; - min-height: 20px; - max-height: 20px; - background-color: #FF4444; -} - -QWidget#legendStdLabel { - color: #FF4444; -} - -QWidget#legendOkWidget { - width: 20px; - min-width: 20px; - max-width: 20px; - height: 20px; - min-height: 20px; - max-height: 20px; - border: 1px solid #6cff6c; -} - -QWidget#legendOkLabel { - color: #6cff6c; -} - -QWidget#legendNgWidget { - width: 20px; - min-width: 20px; - max-width: 20px; - height: 20px; - min-height: 20px; - max-height: 20px; - border: 1px solid #FF4444; -} - -QWidget#legendNgLabel { - color: #FF4444; -} - -QWidget#legendNormalWidget { - width: 20px; - min-width: 20px; - max-width: 20px; - height: 20px; - min-height: 20px; - max-height: 20px; - border: 1px solid #999999; -} - -QWidget#legendNormalLabel { - color: #999999; -} - -EmbedDetail { - background-color: #161B3B; - border: 1px solid #999999; -} - -EmbedDetail QPushButton { - padding: 5px; - font-size: 16px; - border-radius: 2px; -} - -QMessageBox { - background-color: #161B3B; /* QMessageBox背景颜色 */ -} - -QMessageBox QLabel#qt_msgbox_label { /* textLabel */ - color: #FFFFFF; - font-size: 16px; - background-color: transparent; - min-width: 240px; /* textLabel设置最小宽度可以相应的改变QMessageBox的最小宽度 */ - min-height: 40px; /* textLabel和iconLabel高度保持一致 */ -} - -QMessageBox QLabel#qt_msgboxex_icon_label { /* iconLabel */ - width: 40px; - height: 40px; /* textLabel和iconLabel高度保持一致 */ -} - -QMessageBox QPushButton { /* QMessageBox中的QPushButton样式 */ - border: 1px solid #3A36DB; - border-radius: 8px; - background-color: #3A36DB; - color: #FFFFFF; - font-size: 16px; - min-width: 70px; - min-height: 30px; -} - -QMessageBox QPushButton:hover { - background-color: #298DFF; - color: #F2F2F2; -} - -QMessageBox QPushButton:pressed { - background-color: #257FE6; -} - -QMessageBox QDialogButtonBox#qt_msgbox_buttonbox { /* buttonBox */ - button-layout: 0; /* 设置QPushButton布局好像没啥作用 */ -} - -QPlainTextEdit#logText { border: none; - background-color: #222222; +} + +MessageBox { + background-color: #2a2f55; + border: 1px solid rgb(85,89,119); + border-radius: 10px; +} + +MessageBox QPushButton { + color: #ffffff; font-size: 16px; - color: #bbbbbb; + background-color: #1d63b3; + border: 1px solid #257fe6; + border-radius: 7px; + padding: 6px 20px; + margin-top: 10px; +} + +MessageBox QPushButton:hover { + background-color: #298DFF; +} + +TaskResultFrame { + background-color: #161B3B; + border-radius: 10px; +} + +TaskResultEmbedFrame { + background-color: #ffffff; + border-radius: 10px; +} + +TaskResultFrame QWidget#embedButton { + color: #555555; + font-size: 12px; + font-weight: bold; + border: 1px solid #999999; +} + +TaskResultLegendFrame QWidget#legendCheckWidget { + border: 2px solid #a7ffa7; + border-radius: 10px; +} + +TaskResultLegendFrame QWidget#legendCheckLabel { + color: #a7ffa7; +} + +TaskResultLegendFrame QWidget#legendStdWidget { + background-color: #FF4444; + border-radius: 10px; +} + +TaskResultLegendFrame QWidget#legendStdLabel { + color: #FF4444; +} + +TaskResultLegendFrame QWidget#legendOkWidget { + border: 2px solid #6cff6c; + border-radius: 10px; +} + +TaskResultLegendFrame QWidget#legendOkLabel { + color: #6cff6c; +} + +TaskResultLegendFrame QWidget#legendNgWidget { + border: 2px solid #FF4444; + border-radius: 10px; +} + +TaskResultLegendFrame QWidget#legendNgLabel { + color: #FF4444; +} + +TaskResultLegendFrame QWidget#legendNormalWidget { + border: 2px solid #999999; + border-radius: 10px; +} + +TaskResultLegendFrame QWidget#legendNormalLabel { + color: #999999; +} + +TaskResultToolsFrame QPushButton { + color: #ffffff; + font-size: 16px; + background-color: #1d63b3; + border: 1px solid #257fe6; + border-radius: 7px; + padding: 6px 20px; + margin-top: 10px; +} + +TaskResultToolsFrame QPushButton:disabled { + color: #999999; +} + +TaskResultToolsFrame QPlainTextEdit { + font-size: 14px; + border: 1px solid #555977; + background-color: transparent; +} + +TaskResultToolsFrame QPlainTextEdit QScrollBar:vertical { + background: transparent; + width: 8px; + margin: 0; + border-radius: 0; +} + +TaskResultToolsFrame QPlainTextEdit QScrollBar::handle:vertical { + background: #555977; + min-height: 20px; + border-radius: 0; +} + +TaskResultToolsFrame QPlainTextEdit QScrollBar::add-line:vertical { + height: 0; +} + +TaskResultToolsFrame QPlainTextEdit QScrollBar::sub-line:vertical { + height: 0; +} + +TaskResultToolsFrame QPlainTextEdit QScrollBar::add-page:vertical, +TaskResultToolsFrame QPlainTextEdit QScrollBar::sub-page:vertical { + background: none; + border: none; } \ No newline at end of file diff --git a/widget/message_box.py b/widget/message_box.py new file mode 100644 index 0000000..28575bb --- /dev/null +++ b/widget/message_box.py @@ -0,0 +1,69 @@ +from PyQt5.QtCore import Qt, QSize +from PyQt5.QtGui import QColor, QPixmap +from PyQt5.QtWidgets import QFrame, QGridLayout, QLabel, QGraphicsDropShadowEffect, QPushButton + +from core.context import AppContext + + +class MessageBox(QFrame): + def __init__(self, title, mode, text, parent=None): + super(MessageBox, self).__init__(parent) + self.title = title + self.mode = mode + self.text = text + + self.setWindowModality(Qt.WindowModal) + self.setAttribute(Qt.WA_DeleteOnClose) + self.setWindowTitle("") + + self.effect_shadow = QGraphicsDropShadowEffect(self) + self.effect_shadow.setOffset(0, 0) # 偏移 + self.effect_shadow.setBlurRadius(10) # 阴影半径 + self.effect_shadow.setColor(QColor(85,89,119)) # 阴影颜色 + self.setGraphicsEffect(self.effect_shadow) + + self.setGeometry((AppContext.get_main_window().geometry().width() - 420) / 2, + (AppContext.get_main_window().geometry().height() - 220) / 2, + 420, 220) + + self.init_ui() + + def init_ui(self): + layout = QGridLayout() + layout.setContentsMargins(30,20,30,20) + self.setLayout(layout) + + icon_label = QLabel() + icon_label.setFixedWidth(60) + if self.mode == "warning": + icon_label.setPixmap(self.set_icon("assets/warning.png")) + elif self.mode == "error": + icon_label.setPixmap(self.set_icon("assets/error.png")) + elif self.mode == "info": + icon_label.setPixmap(self.set_icon("assets/info.png")) + elif self.mode == "success": + icon_label.setPixmap(self.set_icon("assets/success.png")) + layout.addWidget(icon_label, 0, 0) + + title_label = QLabel() + title_label.setText(self.title) + title_label.setAlignment(Qt.AlignLeft) + title_label.setStyleSheet("font-size: 18px; font-weight: bold;") + layout.addWidget(title_label, 0, 1, Qt.AlignVCenter) + + text_label = QLabel() + text_label.setText(self.text) + text_label.setWordWrap(True) + text_label.setAlignment(Qt.AlignLeft) + layout.addWidget(text_label, 1, 1, Qt.AlignTop) + + button = QPushButton() + button.setText("关闭") + button.clicked.connect(lambda: self.close()) + layout.addWidget(button, 2, 1, Qt.AlignRight) + + @staticmethod + def set_icon(path): + pixmap = QPixmap(path) + scaled_pixmap = pixmap.scaled(40, 40, Qt.KeepAspectRatio, Qt.SmoothTransformation) + return scaled_pixmap \ No newline at end of file diff --git a/widget/task_item.py b/widget/task_item.py new file mode 100644 index 0000000..7e4797c --- /dev/null +++ b/widget/task_item.py @@ -0,0 +1,153 @@ +from datetime import datetime +from os import replace + +from PyQt5.QtGui import QColor, QIcon +from PyQt5.QtWidgets import QVBoxLayout, QWidget, QFrame, QHBoxLayout, QLabel, QGridLayout, QPlainTextEdit, \ + QGraphicsDropShadowEffect, QCommandLinkButton, QScrollArea, QMessageBox +from PyQt5.QtCore import Qt, QSize +import json + +from widget.message_box import MessageBox +from widget.task_result import TaskResultFrame +from widget.task_run import TaskRunDialog +from core.context import AppContext + +class TaskItemFrame(QFrame): + def __init__(self, task, max_height, parent=None): + super(TaskItemFrame, self).__init__(parent) + + self.setFixedSize(int((1920 - 50)/3), int((max_height - 30)/2)) + self.setStyleSheet("background-color: #2a2f55; border-radius: 10px;") + + self.effect_shadow = QGraphicsDropShadowEffect(self) + self.effect_shadow.setOffset(0, 0) # 偏移 + self.effect_shadow.setBlurRadius(10) # 阴影半径 + self.effect_shadow.setColor(QColor(85,89,119)) # 阴影颜色 + self.setGraphicsEffect(self.effect_shadow) + + layout = QGridLayout() + layout.setSpacing(0) + layout.setContentsMargins(30, 10, 20, 10) + + layout.addWidget(self.add_item("任务名称:", True), 0, 0) + layout.addWidget(self.add_item(task[1]), 0, 1) + layout.addWidget(self.add_item("设备序列号:", True), 1, 0) + layout.addWidget(self.add_item(task[2]), 1, 1, 1, 2) + layout.addWidget(self.add_item("开始时间:", True), 3, 0) + if task[6] is None: + layout.addWidget(self.add_item(""), 3, 1, 1, 2) + else: + layout.addWidget(self.add_item(task[6][0: -10]), 3, 1, 1, 2) + layout.addWidget(self.add_item("结束时间:", True), 4, 0) + if task[7] is None: + layout.addWidget(self.add_item(""), 4, 1, 1, 2) + else: + layout.addWidget(self.add_item(task[7][0: -10]), 4, 1, 1, 2) + layout.addWidget(self.add_item("创建时间:", True), 5, 0) + layout.addWidget(self.add_item(task[9][0: -3]), 5, 1, 1, 2) + layout.addWidget(self.add_item("任务参数:", True), 6, 0) + layout.addWidget(self.add_param(task[3]), 6, 1, 1, 2, Qt.AlignTop) + + button_start = QCommandLinkButton("", self) + button_start.setCheckable(True) + icon = QIcon("assets/run.png") + button_start.setIcon(icon) + button_start.setIconSize(QSize(36, 36)) + button_start.clicked.connect(lambda: self.start_task(task)) + layout.addWidget(button_start, 0, 2) + + self.setLayout(layout) + + @staticmethod + def add_item(text, is_label = False): + label = QLabel() + if is_label: + label.setFixedWidth(100) + label.setText(text) + return label + + def add_param(self, json_str): + content_widget = QWidget() + content_widget.setStyleSheet("border: none;") + + scroll_area = QScrollArea() + scroll_area.setObjectName("paramArea") + scroll_area.setStyleSheet("border-radius: 0;") + scroll_area.setWidgetResizable(True) + scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + scroll_area.setFixedSize(QSize(470, 200)) + + scroll_area.setWidget(content_widget) + + if json_str is None or len(json_str) == 0: + return scroll_area + + params = json.loads(json_str) + + if len(params) == 0: + return scroll_area + + layout = QGridLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + + row = 0 + layout.addWidget(self.add_param_item("编号", 150, True), row, 0) + layout.addWidget(self.add_param_item("类型", 100, True), row, 1) + layout.addWidget(self.add_param_item("X", 65, True), row, 2) + layout.addWidget(self.add_param_item("Y", 65, True), row, 3) + layout.addWidget(self.add_param_item("中心点", -1, True), row, 4) + + row = row + 1 + for param in params: + layout.addWidget(self.add_param_item(param['code'], 150, is_bottom = row == len(params)), row, 0) + layout.addWidget(self.add_param_item(param['type'], 100, is_bottom = row == len(params)), row, 1) + layout.addWidget(self.add_param_item(param['x'], 65, is_bottom = row == len(params)), row, 2) + layout.addWidget(self.add_param_item(param['y'], 65, is_bottom = row == len(params)), row, 3) + if len(param['center']) != 0 and '.' not in param['center']: + index = len(param['center']) - 3 + str1 = param['center'][0: index] + str2 = param['center'][index: ] + layout.addWidget(self.add_param_item(str1 + "." + str2, -1, is_bottom = row == len(params)), row, 4) + else: + layout.addWidget(self.add_param_item(param['center'], -1, is_bottom = row == len(params)), row, 4) + row = row + 1 + + content_widget.setLayout(layout) + return scroll_area + + @staticmethod + def add_param_item(text, width, is_header = False, is_bottom = False): + label = QLabel() + if width != -1: + label.setFixedWidth(width) + style_str = "text-align: center; border-right: 1px solid #ffffff;" + if is_header: + label.setFixedHeight(32) + style_str += "background-color: #454962;" + if not is_bottom: + style_str += "border-bottom: 1px solid #ffffff;" + label.setStyleSheet(style_str) + label.setAlignment(Qt.AlignCenter) + label.setText(text) + return label + + @staticmethod + def start_task(task): + params = json.loads(task[3]) + if len(task[3]) == 0 or len(params) == 0: + MessageBox("任务名称: " + task[1],"warning", "任务未设置参数!", AppContext.get_main_window()).show() + return + task_table = AppContext.get_edge_context().get_component("dat_task") + task_table.update_task({ "id": task[0], "state": 1, "start_time": datetime.now() }) + + TaskResultFrame(task, AppContext.get_main_window()).show() + + # self.run_dialog = TaskRunDialog(task[3]) + # self.run_dialog.setGeometry(0,0,1920,1080) + # dialog_result = self.run_dialog.exec_() + # if dialog_result == 0: + # c = 0 + # # self.name_text.setText(None) + # # self.file_content.setPlainText(None) diff --git a/widget/task_list.py b/widget/task_list.py index c77a8d6..d804d4c 100644 --- a/widget/task_list.py +++ b/widget/task_list.py @@ -1,148 +1,61 @@ -import json -from datetime import datetime - -import pandas as pd -from PyQt5.QtCore import Qt, QRect -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QGridLayout, QLineEdit, QLabel, QHBoxLayout, QPushButton, QFileDialog, \ - QScrollArea, QPlainTextEdit, QMessageBox +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QGridLayout, QLabel, QScrollArea, QFrame from core.context import AppContext -from widget.task_run import TaskRunDialog +from widget.task_item import TaskItemFrame - -class TaskListWidget(QWidget): +class TaskListFrame(QFrame): def __init__(self, parent=None): - super(TaskListWidget, self).__init__(parent) - self.ratio = AppContext.get_ratio() - self.run_dialog = None + super(TaskListFrame, self).__init__(parent) - scroll_area = QScrollArea() - scroll_area.setStyleSheet("border: none;") - scroll_area.setWidgetResizable(True) - scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) - - self.content_widget = QWidget() - - scroll_area.setWidget(self.content_widget) - - widget = QWidget() - widget_layout = QVBoxLayout(widget) - widget_layout.setContentsMargins(10, 10, 10, 10) - widget_layout.setSpacing(0) - widget_layout.addWidget(scroll_area) + self.setStyleSheet("background-color: #15182b") layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) - layout.addWidget(widget) - self.init_ui() + self.content_widget = QWidget() + self.content_widget_layout = QGridLayout(self.content_widget) + self.content_widget_layout.setContentsMargins(10, 10, 20, 10) + self.content_widget_layout.setSpacing(10) + + scroll_area = QScrollArea() + scroll_area.setObjectName("taskArea") + scroll_area.setWidgetResizable(True) + scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + scroll_area.setWidget(self.content_widget) + layout.addWidget(scroll_area) AppContext.get_edge_context().get_component('dat_task').signals.on_receive_task.connect(self.init_ui) + def showEvent(self, e): + self.init_ui() + def init_ui(self): task_table = AppContext.get_edge_context().get_component("dat_task") tasks = task_table.list_task(1) if len(tasks) == 0: return - self.content_widget.children().clear() - # 添加 TITLE - x = 0 - y = 0 - offset = 10 - x = x + offset - y = y + offset - label_name = QLabel(self.content_widget) - label_name.setObjectName("THeader") - label_name.setText("任务名称") - label_name.setGeometry(QRect(x, y, 200, 30)) - x = x + 200 + offset - label_sn = QLabel(self.content_widget) - label_sn.setObjectName("THeader") - label_sn.setText("设备序列号") - label_sn.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - label_param = QLabel(self.content_widget) - label_param.setObjectName("THeader") - label_param.setText("参数") - label_param.setGeometry(QRect(x, y, 400, 30)) - x = x + 400 + offset - label_start = QLabel(self.content_widget) - label_start.setObjectName("THeader") - label_start.setText("开始时间") - label_start.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - label_end = QLabel(self.content_widget) - label_end.setObjectName("THeader") - label_end.setText("结束时间") - label_end.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - label_create = QLabel(self.content_widget) - label_create.setObjectName("THeader") - label_create.setText("创建时间") - label_create.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - label_action = QLabel(self.content_widget) - label_action.setObjectName("THeader") - label_action.setText("操作") - label_action.setGeometry(QRect(x, y, 200, 30)) - y = y + 30 + offset + while self.content_widget_layout.count(): + item = self.content_widget_layout.takeAt(0) + widget = item.widget() + if widget is not None: + widget.deleteLater() + + row = 0 + column = 0 for task in tasks: - x = offset - label_name = QLabel(self.content_widget) - label_name.setText(task[1]) - label_name.setGeometry(QRect(x, y, 200, 30)) - x = x + 200 + offset - label_sn = QLabel(self.content_widget) - label_sn.setText(task[2]) - label_sn.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - param = QPlainTextEdit(self.content_widget) - param.setPlainText(task[3]) - param.setReadOnly(True) - param.setStyleSheet("border: 1px solid rgba(58,54,219,0.45); border-radius: 6px;") - param.setGeometry(QRect(x, y, 400, 120)) - x = x + 400 + offset - label_start = QLabel(self.content_widget) - label_start.setText(task[6]) - label_start.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - label_end = QLabel(self.content_widget) - label_end.setText(task[7]) - label_end.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - label_create = QLabel(self.content_widget) - label_create.setText(task[8]) - label_create.setGeometry(QRect(x, y, 150, 30)) - x = x + 150 + offset - run_task = QPushButton(self.content_widget) - run_task.setStyleSheet("background-color: #3A36DB;") - run_task.setObjectName("run_task") - run_task.setText("开始任务") - run_task.setGeometry(QRect(x, y, 120, 30)) - run_task.clicked.connect(lambda: self.start_task(task)) + task_item = TaskItemFrame(task, self.content_widget.geometry().height()) + self.content_widget_layout.addWidget(task_item, row, column, Qt.AlignTop) + column += 1 + if column == 3: + row += 1 + column = 0 - y = y + 120 + offset - - self.content_widget.setFixedHeight(y + offset) - - for ctl in self.content_widget.children(): - if isinstance(ctl, QWidget): - ctl.setVisible(True) - - def start_task(self, task): - task_table = AppContext.get_edge_context().get_component("dat_task") - task_table.update_task({ "id": task[0], "state": 1, "start_time": datetime.now() }) - try: - param_json = json.loads(task[3]) - self.run_dialog = TaskRunDialog(param_json) - self.run_dialog.setGeometry(0,0,1920,1080) - dialog_result = self.run_dialog.exec_() - if dialog_result == 0: - c = 0 - # self.name_text.setText(None) - # self.file_content.setPlainText(None) - except Exception as e: - QMessageBox.warning(self, 'JSON Error', f'Invalid JSON: {e}') \ No newline at end of file + if column == 1 and row == 0: + self.content_widget_layout.addWidget(QWidget(), 0, 1) + self.content_widget_layout.addWidget(QWidget(), 0, 2) + if column == 2 and row == 0: + self.content_widget_layout.addWidget(QWidget(), 0, 2) diff --git a/widget/task_result.py b/widget/task_result.py new file mode 100644 index 0000000..abc70c7 --- /dev/null +++ b/widget/task_result.py @@ -0,0 +1,170 @@ +from PyQt5.QtWidgets import QFrame, QGraphicsDropShadowEffect, QWidget, QGridLayout, QLabel +from PyQt5.QtCore import Qt, QSize, QRect +from PyQt5.QtGui import QColor, QPixmap, QImage + +from components.image_framework import MSG_LOCATION_RECORD, MSG_DETECTION_RECORD, get_msg_info +from core.context import AppContext +from widget.message_box import MessageBox +from widget.task_result_embed import TaskResultEmbedFrame +from widget.task_result_legend import TaskResultLegendFrame +from widget.task_result_tools import TaskResultToolsFrame +import json +import math +import cv2 + +class TaskResultFrame(QFrame): + def __init__(self, task, parent=None): + super(TaskResultFrame, self).__init__(parent) + self.task = task + + self.setWindowModality(Qt.WindowModal) + self.setAttribute(Qt.WA_DeleteOnClose) + self.setWindowTitle("") + + self.effect_shadow = QGraphicsDropShadowEffect(self) + self.effect_shadow.setOffset(0, 0) # 偏移 + self.effect_shadow.setBlurRadius(10) # 阴影半径 + self.effect_shadow.setColor(QColor(85,89,119)) # 阴影颜色 + self.setGraphicsEffect(self.effect_shadow) + + self.result_embed_frame = None + self.result_big_widget = None + self.result_big_label = None + self.result_small_widget = None + self.result_small_label = None + self.result_tools_frame = None + + self.init_ui() + + self.setGeometry(5, 5, AppContext.get_main_window().geometry().width() - 10, AppContext.get_main_window().geometry().height() - 10) + + AppContext.get_edge_context().get_component('image-framework').signals.on_image_detect_result.connect( + lambda data: self.image_result(data)) + + def showEvent(self, e): + big_width = self.result_big_widget.geometry().width() + big_height = self.result_big_widget.geometry().height() + self.result_big_label.setFixedWidth(1920 * (big_height - 20) / 1080) + self.result_big_label.setFixedHeight(big_height - 20) + self.result_big_label.move((big_width - 1920 * (big_height - 20) / 1080) / 2, 10) + + small_width = self.result_small_widget.geometry().width() + small_height = self.result_small_widget.geometry().height() + self.result_small_label.setFixedWidth(930 * (small_height - 20) / 700) + self.result_small_label.setFixedHeight(small_height - 20) + self.result_small_label.move((small_width - 930 * (small_height - 20) / 700) / 2, 10) + + AppContext.get_edge_context().get_component('image-framework').start_location() + + def image_result(self, msg): + qt_image = None + if msg.im2D is not None: + rgb_frame = cv2.cvtColor(msg.im2D, cv2.COLOR_BGR2RGB) + height, width, channels = rgb_frame.shape + bytes_per_line = channels * width + qt_image = QImage(rgb_frame.data, width, height, bytes_per_line, QImage.Format_RGB888) + + if msg.msg_type == MSG_LOCATION_RECORD: + if qt_image is None: + return + try: + big_pixmap = QPixmap.fromImage(qt_image) + # sc = big_pixmap.height() / self.result_big_label.geometry().height() + # self.view_label.setFixedWidth(view_pixmap.width() / sc) + self.result_big_label.setPixmap(big_pixmap) + # self.view_label.setGeometry((self.view_widget.width() - self.view_label.width()) / 2, 0, self.view_label.width(), self.view_label.height()) + except Exception as e: + dd = 0 + elif msg.msg_type == MSG_DETECTION_RECORD: + # 显示日志 + # self.log_text.appendPlainText(get_msg_info(msg.record.code).decode('utf-8')) + if msg.record.code < 0: + self.result_tools_frame.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("red")) + self.result_tools_frame.set_default() + MessageBox("错误信息", "error", get_msg_info(msg.record.code).decode('utf-8'), AppContext.get_main_window()).show() + + # self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("red")) + # QMessageBox.warning(self, '错误信息', get_msg_info(msg.record.code).decode('utf-8')) + # self.set_button_default() + AppContext.get_edge_context().get_component('image-framework').start_location() + elif msg.record.code == 1008: + self.result_tools_frame.start_adjust_button.setEnabled(False) + self.result_tools_frame.start_check_button.setEnabled(True) + self.result_tools_frame.stop_check_button.setEnabled(True) + self.result_tools_frame.stop_task_button.setEnabled(False) + elif msg.record.code == 1012: + # self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("green")) + # QMessageBox.warning(self, '成功信息', "检测结束") + # self.set_button_default() + + self.result_tools_frame.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("green")) + self.result_tools_frame.set_default() + MessageBox("成功信息", "success", "检测结束", AppContext.get_main_window()).show() + AppContext.get_edge_context().get_component('image-framework').start_location() + else: + self.result_tools_frame.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("white")) + # self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("white")) + if qt_image is None: + return + try: + small_pixmap = QPixmap.fromImage(qt_image) + self.result_small_label.setPixmap(small_pixmap) + # view_pixmap = QPixmap.fromImage(qt_image) + # self.picture_label.setPixmap(view_pixmap) + except Exception as e: + dd = 0 + else: + ddd = 0 + + def init_ui(self): + layout = QGridLayout() + layout.setRowStretch(0,15) + layout.setRowStretch(1,1) + layout.setRowStretch(2,15) + self.setLayout(layout) + + # bim + self.result_embed_frame = TaskResultEmbedFrame(self.task) + layout.addWidget(self.result_embed_frame, 0, 0) + + # legend + layout.addWidget(TaskResultLegendFrame(), 1, 0) + + # result + result_widget = QWidget() + result_widget_layout = QGridLayout() + result_widget_layout.setContentsMargins(0,0,0,0) + result_widget_layout.setColumnStretch(0, 5) + result_widget_layout.setColumnStretch(1, 4) + result_widget_layout.setColumnStretch(2, 1) + result_widget.setLayout(result_widget_layout) + layout.addWidget(result_widget, 2, 0) + + # result + # 摄像头1 + self.result_big_widget = QWidget() + self.result_big_widget.setStyleSheet("background-color: rgba(255, 255, 255, 0.1);") + self.result_big_label = QLabel(self.result_big_widget) + self.result_big_label.setText("广角摄像头") + self.result_big_label.setAlignment(Qt.AlignCenter) + self.result_big_label.setStyleSheet("background: #222222;") + self.result_big_label.setVisible(True) + + # 摄像头2 + self.result_small_widget = QWidget() + self.result_small_widget.setStyleSheet("background-color: rgba(255, 255, 255, 0.1);") + self.result_small_label = QLabel(self.result_small_widget) + self.result_small_label.setText("高清摄像头") + self.result_small_label.setAlignment(Qt.AlignCenter) + self.result_small_label.setStyleSheet("background: #222222;") + self.result_small_label.setVisible(True) + + # 按钮 + self.result_tools_frame = TaskResultToolsFrame(self) + self.result_tools_frame.set_default() + + # 布局 + result_widget_layout.addWidget(self.result_big_widget, 0, 0) + result_widget_layout.addWidget(self.result_small_widget, 0, 1) + result_widget_layout.addWidget(self.result_tools_frame, 0, 2) + diff --git a/widget/task_result_embed.py b/widget/task_result_embed.py new file mode 100644 index 0000000..d9ddeee --- /dev/null +++ b/widget/task_result_embed.py @@ -0,0 +1,42 @@ +import math + +from PyQt5.QtWidgets import QFrame, QWidget, QPushButton +import json + +from exceptiongroup import catch + +class TaskResultEmbedFrame(QFrame): + def __init__(self, task, parent=None): + super(TaskResultEmbedFrame, self).__init__(parent) + self.task = task + self.embed_buttons = [] + + def showEvent(self, e): + params = json.loads(self.task[3]) + try: + max_x = math.ceil(float(max(params, key=lambda p: float(p["x"]))["x"]) / 1000) * 1000 + max_y = math.ceil(float(max(params, key=lambda p: float(p["center"]))["center"])) * 1000 + w = self.geometry().width() + h = self.geometry().height() + scale = min(max_x / w, max_y / h) + for param in params: + embed_button = QPushButton(param["code"], self) + embed_button.setObjectName("embedButton") + embed_button.setFixedSize(math.ceil(float(param["w"]) / scale), math.ceil(float(param["h"]) / scale)) + left = math.ceil((float(param["x"]) - float(param["w"]) / 2) / scale) + top = h - math.ceil(float(param["center"]) * 1000 / scale) + embed_button.move(left, top) + embed_button.setVisible(True) + + except ValueError: + print("任务参数有错误!") + + def setChecked(self, text): + for btn in self.embed_buttons: + if btn.text() == text: + btn.setStyleSheet("border: 1px solid #6cff6c;") + + def setError(self, text): + for btn in self.embed_buttons: + if btn.text() == text: + btn.setStyleSheet("border: 1px solid #FF4444;") \ No newline at end of file diff --git a/widget/task_result_legend.py b/widget/task_result_legend.py new file mode 100644 index 0000000..2efb13c --- /dev/null +++ b/widget/task_result_legend.py @@ -0,0 +1,63 @@ +from PyQt5.QtCore import QSize +from PyQt5.QtWidgets import QFrame, QWidget, QGridLayout, QLabel + + +class TaskResultLegendFrame(QFrame): + def __init__(self, parent=None): + super(TaskResultLegendFrame, self).__init__(parent) + + layout = QGridLayout() + layout.setContentsMargins(0,0,0,0) + self.setLayout(layout) + + legend_check_widget = QWidget() + legend_check_widget.setObjectName("legendCheckWidget") + legend_check_widget.setFixedSize(QSize(20, 20)) + # legend_std_widget = QWidget() + # legend_std_widget.setObjectName("legendStdWidget") + legend_ok_widget = QWidget() + legend_ok_widget.setObjectName("legendOkWidget") + legend_ok_widget.setFixedSize(QSize(20, 20)) + legend_ng_widget = QWidget() + legend_ng_widget.setObjectName("legendNgWidget") + legend_ng_widget.setFixedSize(QSize(20, 20)) + legend_normal_widget = QWidget() + legend_normal_widget.setObjectName("legendNormalWidget") + legend_normal_widget.setFixedSize(QSize(20, 20)) + + legend_check_label = QLabel() + legend_check_label.setObjectName("legendCheckLabel") + legend_check_label.setText("检测区域") + # legend_std_label = QLabel() + # legend_std_label.setObjectName("legendStdLabel") + # legend_std_label.setText("基准件") + legend_ok_label = QLabel() + legend_ok_label.setObjectName("legendOkLabel") + legend_ok_label.setText("合格件") + legend_ng_label = QLabel() + legend_ng_label.setObjectName("legendNgLabel") + legend_ng_label.setText("不合格件") + legend_normal_label = QLabel() + legend_normal_label.setObjectName("legendNormalLabel") + legend_normal_label.setText("待检测件") + + layout.setColumnStretch(0,6) + layout.setColumnStretch(1,1) + layout.setColumnStretch(2,1) + layout.setColumnStretch(3,1) + layout.setColumnStretch(4,1) + layout.setColumnStretch(5,1) + layout.setColumnStretch(6,1) + layout.setColumnStretch(7,1) + layout.setColumnStretch(8,1) + layout.setColumnStretch(9,6) + + layout.addWidget(legend_check_widget, 0, 1) + layout.addWidget(legend_check_label, 0, 2) + layout.addWidget(legend_ok_widget, 0, 3) + layout.addWidget(legend_ok_label, 0, 4) + layout.addWidget(legend_ng_widget, 0, 5) + layout.addWidget(legend_ng_label, 0, 6) + layout.addWidget(legend_normal_widget, 0, 7) + layout.addWidget(legend_normal_label, 0, 8) + layout.addWidget(QWidget(), 0, 9) \ No newline at end of file diff --git a/widget/task_result_tools.py b/widget/task_result_tools.py new file mode 100644 index 0000000..b6db9d9 --- /dev/null +++ b/widget/task_result_tools.py @@ -0,0 +1,117 @@ +from PyQt5.QtGui import QTextCharFormat, QColor, QBrush, QPixmap +from PyQt5.QtWidgets import QFrame, QPushButton, QSizePolicy, QGridLayout, QPlainTextEdit +from rich.layout import Layout +from components.image_framework import MSG_LOCATION_RECORD, MSG_DETECTION_RECORD, get_msg_info +from core.context import AppContext + + +class TaskResultToolsFrame(QFrame): + def __init__(self, parent=None): + super(TaskResultToolsFrame, self).__init__(parent) + + self.task_result = parent + + layout = QGridLayout() + layout.setContentsMargins(10, 0, 10, 10) + + self.log_text = QPlainTextEdit() + self.log_text.setObjectName("logText") + self.log_text.setReadOnly(True) + + self.start_adjust_button = QPushButton() + self.start_adjust_button.setObjectName("startAdjustButton") + self.start_adjust_button.setText("开始校准") + self.start_adjust_button.setFixedHeight(42) + self.start_adjust_button.clicked.connect(self.start_adjust) + + self.start_check_button = QPushButton() + self.start_check_button.setObjectName("startCheckButton") + self.start_check_button.setEnabled(False) + self.start_check_button.setText("开始检测") + self.start_check_button.setFixedHeight(42) + self.start_check_button.clicked.connect(self.start_check) + + self.stop_check_button = QPushButton() + self.stop_check_button.setObjectName("stopCheckButton") + self.stop_check_button.setEnabled(False) + self.stop_check_button.setText("停止检测") + self.stop_check_button.setFixedHeight(42) + self.stop_check_button.clicked.connect(self.stop_check) + + self.stop_task_button = QPushButton() + self.stop_task_button.setObjectName("stopTaskButton") + self.stop_task_button.setText("结束任务") + self.stop_task_button.setFixedHeight(42) + self.stop_task_button.clicked.connect(self.stop_task) + + layout.setRowStretch(0,6) + layout.setRowStretch(1,1) + layout.setRowStretch(2,1) + layout.setRowStretch(3,1) + layout.setRowStretch(4,1) + layout.addWidget(self.log_text, 0, 0) + layout.addWidget(self.start_adjust_button, 1, 0) + layout.addWidget(self.start_check_button, 2, 0) + layout.addWidget(self.stop_check_button, 3, 0) + layout.addWidget(self.stop_task_button, 4, 0) + + self.setLayout(layout) + + def insert_text(self, text, font_color): + char_format = QTextCharFormat() + char_format.setForeground(QBrush(font_color)) + self.log_text.mergeCurrentCharFormat(char_format) + self.log_text.appendPlainText(text) + + # 开始校准 + def start_adjust(self): + self.start_adjust_button.setEnabled(False) + self.start_check_button.setEnabled(False) + self.stop_check_button.setEnabled(False) + self.stop_task_button.setEnabled(False) + + self.log_text.setPlainText("") + self.task_result.result_big_label.setPixmap(QPixmap("")) + self.task_result.result_big_label.setText("广角摄像头") + self.task_result.result_small_label.setPixmap(QPixmap("")) + self.task_result.result_small_label.setText("高清摄像头") + + result = AppContext.get_edge_context().get_component('image-framework').start_adjust() + if result.code < 0: + self.set_default() + MessageBox("校准启动失败", "error", get_msg_info(msg.record.code).decode('utf-8'), AppContext.get_main_window()).show() + # QMessageBox.warning(self, '校准启动失败', get_msg_info(msg.record.code).decode('utf-8')) + + # 开始检测 + def start_check(self): + self.start_adjust_button.setEnabled(False) + self.start_check_button.setEnabled(False) + self.stop_check_button.setEnabled(False) + self.stop_task_button.setEnabled(False) + result = AppContext.get_edge_context().get_component('image-framework').start_check() + if result.code < 0: + self.set_default() + MessageBox("检测启动失败", "error", get_msg_info(msg.record.code).decode('utf-8'), AppContext.get_main_window()).show() + + # 停止检测 + def stop_check(self): + self.start_adjust_button.setEnabled(False) + self.start_check_button.setEnabled(False) + self.stop_check_button.setEnabled(False) + self.stop_task_button.setEnabled(False) + result = AppContext.get_edge_context().get_component('image-framework').stop_check() + if result.code < 0: + MessageBox("检测停止失败", "error", get_msg_info(msg.record.code).decode('utf-8'), AppContext.get_main_window()).show() + # QMessageBox.warning(self, '检测停止失败', get_msg_info(msg.record.code).decode('utf-8')) + self.set_default() + + # 结束任务 + def stop_task(self): + AppContext.get_edge_context().get_component('image-framework').stop_all() + self.task_result.close() + + def set_default(self): + self.start_adjust_button.setEnabled(True) + self.start_check_button.setEnabled(False) + self.stop_check_button.setEnabled(False) + self.stop_task_button.setEnabled(True) \ No newline at end of file diff --git a/widget/task_run.py b/widget/task_run.py index b91e5f2..3d02348 100644 --- a/widget/task_run.py +++ b/widget/task_run.py @@ -44,55 +44,55 @@ class TaskRunDialog(QDialog): AppContext.get_edge_context().get_component('image-framework').signals.on_image_detect_result.connect( lambda data: self.image_result(data)) - def image_result(self, msg): - qt_image = None - if msg.im2D is not None: - rgb_frame = cv2.cvtColor(msg.im2D, cv2.COLOR_BGR2RGB) - height, width, channels = rgb_frame.shape - bytes_per_line = channels * width - qt_image = QImage(rgb_frame.data, width, height, bytes_per_line, QImage.Format_RGB888) - - if msg.msg_type == MSG_LOCATION_RECORD: - if qt_image is None: - return - try: - view_pixmap = QPixmap.fromImage(qt_image) - sc = view_pixmap.height() / 450 - self.view_label.setFixedWidth(view_pixmap.width() / sc) - self.view_label.setPixmap(view_pixmap) - self.view_label.setGeometry((self.view_widget.width() - self.view_label.width()) / 2, 0, self.view_label.width(), self.view_label.height()) - except Exception as e: - dd = 0 - elif msg.msg_type == MSG_DETECTION_RECORD: - # 显示日志 - # self.log_text.appendPlainText(get_msg_info(msg.record.code).decode('utf-8')) - if msg.record.code < 0: - self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("red")) - QMessageBox.warning(self, '错误信息', get_msg_info(msg.record.code).decode('utf-8')) - self.set_button_default() - AppContext.get_edge_context().get_component('image-framework').start_location() - elif msg.record.code == 1008: - self.start_adjust_button.setEnabled(False) - self.start_check_button.setEnabled(True) - self.stop_check_button.setEnabled(True) - self.stop_task_button.setEnabled(False) - elif msg.record.code == 1012: - self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("green")) - QMessageBox.warning(self, '成功信息', "检测结束") - self.set_button_default() - AppContext.get_edge_context().get_component('image-framework').start_location() - else: - self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("white")) - - if qt_image is None: - return - try: - view_pixmap = QPixmap.fromImage(qt_image) - self.picture_label.setPixmap(view_pixmap) - except Exception as e: - dd = 0 - else: - ddd = 0 + # def image_result(self, msg): + # qt_image = None + # if msg.im2D is not None: + # rgb_frame = cv2.cvtColor(msg.im2D, cv2.COLOR_BGR2RGB) + # height, width, channels = rgb_frame.shape + # bytes_per_line = channels * width + # qt_image = QImage(rgb_frame.data, width, height, bytes_per_line, QImage.Format_RGB888) + # + # if msg.msg_type == MSG_LOCATION_RECORD: + # if qt_image is None: + # return + # try: + # view_pixmap = QPixmap.fromImage(qt_image) + # sc = view_pixmap.height() / 450 + # self.view_label.setFixedWidth(view_pixmap.width() / sc) + # self.view_label.setPixmap(view_pixmap) + # self.view_label.setGeometry((self.view_widget.width() - self.view_label.width()) / 2, 0, self.view_label.width(), self.view_label.height()) + # except Exception as e: + # dd = 0 + # elif msg.msg_type == MSG_DETECTION_RECORD: + # # 显示日志 + # # self.log_text.appendPlainText(get_msg_info(msg.record.code).decode('utf-8')) + # if msg.record.code < 0: + # self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("red")) + # QMessageBox.warning(self, '错误信息', get_msg_info(msg.record.code).decode('utf-8')) + # self.set_button_default() + # AppContext.get_edge_context().get_component('image-framework').start_location() + # elif msg.record.code == 1008: + # self.start_adjust_button.setEnabled(False) + # self.start_check_button.setEnabled(True) + # self.stop_check_button.setEnabled(True) + # self.stop_task_button.setEnabled(False) + # elif msg.record.code == 1012: + # self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("green")) + # QMessageBox.warning(self, '成功信息', "检测结束") + # self.set_button_default() + # AppContext.get_edge_context().get_component('image-framework').start_location() + # else: + # self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("white")) + # + # if qt_image is None: + # return + # try: + # view_pixmap = QPixmap.fromImage(qt_image) + # self.picture_label.setPixmap(view_pixmap) + # except Exception as e: + # dd = 0 + # else: + # ddd = 0 def insert_text(self, text, font_color): fmt = QTextCharFormat() @@ -115,13 +115,13 @@ class TaskRunDialog(QDialog): self.check_widget.setFixedSize(160, 160) self.check_widget.move(90, 230) - # 预埋件 - self.embed_widgets = [] - for item in self.param: - embed_item = EmbedItem(self.bim_widget) - embed_item.setObjectName(item["code"]) - embed_item.setItemParam(item) - self.embed_widgets.append(embed_item) + # # 预埋件 + # self.embed_widgets = [] + # for item in self.param: + # embed_item = EmbedItem(self.bim_widget) + # embed_item.setObjectName(item["code"]) + # embed_item.setItemParam(item) + # self.embed_widgets.append(embed_item) map_widget = QWidget() legend_widget = QWidget() @@ -293,59 +293,59 @@ class TaskRunDialog(QDialog): self.set_button_default() - index = 0 - for item in self.embed_widgets: - if item.objectName() == 'STD': continue - if self.check_widget.geometry().contains(item.rect): - item.setIndex(str(self.checkIndex)) - if index % 2 == 0: - item.setChecked() - else: - item.setError() - index += 1 + # index = 0 + # for item in self.embed_widgets: + # if item.objectName() == 'STD': continue + # if self.check_widget.geometry().contains(item.rect): + # item.setIndex(str(self.checkIndex)) + # if index % 2 == 0: + # item.setChecked() + # else: + # item.setError() + # index += 1 # 校准 - def start_adjust(self): - self.start_adjust_button.setEnabled(False) - self.start_check_button.setEnabled(False) - self.stop_check_button.setEnabled(False) - self.stop_task_button.setEnabled(False) - - self.log_text.setPlainText("") - self.picture_label.setPixmap(QPixmap("")) - - result = AppContext.get_edge_context().get_component('image-framework').start_adjust() - if result.code < 0: - self.set_button_default() - QMessageBox.warning(self, '校准启动失败', get_msg_info(msg.record.code).decode('utf-8')) - - def start_check(self): - self.start_adjust_button.setEnabled(False) - self.start_check_button.setEnabled(False) - self.stop_check_button.setEnabled(False) - self.stop_task_button.setEnabled(False) - - result = AppContext.get_edge_context().get_component('image-framework').start_check() - if result.code < 0: - self.set_button_default() - QMessageBox.warning(self, '检测启动失败', get_msg_info(msg.record.code).decode('utf-8')) - - def stop_check(self): - self.start_adjust_button.setEnabled(False) - self.start_check_button.setEnabled(False) - self.stop_check_button.setEnabled(False) - self.stop_task_button.setEnabled(False) - result = AppContext.get_edge_context().get_component('image-framework').stop_check() - if result.code < 0: - QMessageBox.warning(self, '检测停止失败', get_msg_info(msg.record.code).decode('utf-8')) - self.set_button_default() - - def stop_task(self): - AppContext.get_edge_context().get_component('image-framework').stop_all() - self.reject() - - def set_button_default(self): - self.start_adjust_button.setEnabled(True) - self.start_check_button.setEnabled(False) - self.stop_check_button.setEnabled(False) - self.stop_task_button.setEnabled(True) \ No newline at end of file + # def start_adjust(self): + # self.start_adjust_button.setEnabled(False) + # self.start_check_button.setEnabled(False) + # self.stop_check_button.setEnabled(False) + # self.stop_task_button.setEnabled(False) + # + # self.log_text.setPlainText("") + # self.picture_label.setPixmap(QPixmap("")) + # + # result = AppContext.get_edge_context().get_component('image-framework').start_adjust() + # if result.code < 0: + # self.set_button_default() + # QMessageBox.warning(self, '校准启动失败', get_msg_info(msg.record.code).decode('utf-8')) + # + # def start_check(self): + # self.start_adjust_button.setEnabled(False) + # self.start_check_button.setEnabled(False) + # self.stop_check_button.setEnabled(False) + # self.stop_task_button.setEnabled(False) + # + # result = AppContext.get_edge_context().get_component('image-framework').start_check() + # if result.code < 0: + # self.set_button_default() + # QMessageBox.warning(self, '检测启动失败', get_msg_info(msg.record.code).decode('utf-8')) + # + # def stop_check(self): + # self.start_adjust_button.setEnabled(False) + # self.start_check_button.setEnabled(False) + # self.stop_check_button.setEnabled(False) + # self.stop_task_button.setEnabled(False) + # result = AppContext.get_edge_context().get_component('image-framework').stop_check() + # if result.code < 0: + # QMessageBox.warning(self, '检测停止失败', get_msg_info(msg.record.code).decode('utf-8')) + # self.set_button_default() + # + # def stop_task(self): + # AppContext.get_edge_context().get_component('image-framework').stop_all() + # self.reject() + # + # def set_button_default(self): + # self.start_adjust_button.setEnabled(True) + # self.start_check_button.setEnabled(False) + # self.stop_check_button.setEnabled(False) + # self.stop_task_button.setEnabled(True) \ No newline at end of file