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)