From cf15bc7063189f82229495de0f1c3f1ae431a148 Mon Sep 17 00:00:00 2001 From: njdaoyehu Date: Fri, 14 Feb 2025 14:22:23 +0800 Subject: [PATCH] fixed --- assets/error.png | Bin 0 -> 969 bytes assets/info.png | Bin 0 -> 812 bytes assets/logo.png | Bin 10677 -> 8904 bytes assets/radar-fill-green.png | Bin 361 -> 502 bytes assets/radar-fill-red.png | Bin 349 -> 492 bytes assets/run.png | Bin 0 -> 1145 bytes assets/success.png | Bin 0 -> 939 bytes assets/warning.png | Bin 0 -> 761 bytes components/dat_task.py | 2 +- core/context.py | 13 +- core/edge_context.py | 2 +- main.py | 49 +++-- styles/global.qss | 397 +++++++++++++++-------------------- widget/message_box.py | 69 ++++++ widget/task_item.py | 153 ++++++++++++++ widget/task_list.py | 167 ++++----------- widget/task_result.py | 170 +++++++++++++++ widget/task_result_embed.py | 42 ++++ widget/task_result_legend.py | 63 ++++++ widget/task_result_tools.py | 117 +++++++++++ widget/task_run.py | 220 +++++++++---------- 21 files changed, 973 insertions(+), 491 deletions(-) create mode 100644 assets/error.png create mode 100644 assets/info.png create mode 100644 assets/run.png create mode 100644 assets/success.png create mode 100644 assets/warning.png create mode 100644 widget/message_box.py create mode 100644 widget/task_item.py create mode 100644 widget/task_result.py create mode 100644 widget/task_result_embed.py create mode 100644 widget/task_result_legend.py create mode 100644 widget/task_result_tools.py diff --git a/assets/error.png b/assets/error.png new file mode 100644 index 0000000000000000000000000000000000000000..847d39017f48e93c03b8bd30b68f167c0971c466 GIT binary patch literal 969 zcmV;)12+7LP)Px&gGod|RA@u(nN3n+K@5NsbcBclL3C@1fFS7FPi_xBUqs&W{h!1JNSUBEWVuphFgj1du-y zgK%ef3u3J$+>Jgubj=e*1E66#W9rl(kX-+NY~HNGJ8)iyK#-*YV4>FXz1R{2hjWDY zg)OWJMF3g==R)KPF9AsPAZdXT0IluLX_F6uoQTH;0QWm7aAMk*gfH!-Eb-WC5KGy{ z2_IH;YsHp=xGW1P1*9>UuxZWvyroWP7PTZ4xekO~XkxIi6sb}OK1fONs1&l}x+Gcd z70pX+vbF6H16UbuWB@+MDAhQpYm^3-*l2oEGv^+*3HzbQ80jJ0cPyi3cs@2)htGF+ zYw6rP(8QWLCzN%VITR>>o;E7-jbG6~BlYfWZX&eIBhBGOBc+swb8>jeeB7J?0HppW zygRv8X_zx}b7ln*)A6Zmm4m+usj{T6vARutuC2wEl>YYjpS~Ke-Bei7=X9<~7xG%G z(;vZ%Z>CE?w4G><=Dl2IfMb6SW9g+v4MMOcpeOfANm{Q%1>b@2Mq96^=5NUbvjF@B zu1W&ptj!l3r75}yAhd?%y_gofCGN-XDh6n@(-n+k?%~geZ*kgK&$j}=Vcg$m^_taM rtUlvh>lXM7A!B!b0sL!?^XL5m**6tlhshPi00000NkvXXu0mjfCuhn1 literal 0 HcmV?d00001 diff --git a/assets/info.png b/assets/info.png new file mode 100644 index 0000000000000000000000000000000000000000..4b984f960385b5e4a20a6140998002b1370d5d1f GIT binary patch literal 812 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 diff --git a/assets/radar-fill-green.png b/assets/radar-fill-green.png index 9bd2dcbe7db6a7323ef052083a58e34f9b4f1693..550e04ab47d8bd5c5437fd61b17ccf3b8320e77d 100644 GIT binary patch literal 502 zcmVPx$ut`KgR7gv;Rb5iTFc99&=peT!ClSs-o$-xw0FWDiH$Xf9_~rwgfqD{p3q+l) zUD7qFP20>c@Wep!{p`;dge!mW%J^^*!Soc*0Vq)#$II?E^@;ToOuilxMf#oq6MKm= z1V~Zi8-vY`kC9eC2mW7a7z7hcKI1(i^y^Bu>TJ)V|YWD^0fC_vAn z7(!sjyoG?l$|RIE<&7+(M29=(jbUf%`n~7nGY-s#=S}{QJ`}YdiQ~p5yJe7OS^!Ec zk-uQR>GL|Mn+PT)MI%iZAyQ-rjjJL7D!uZ@b&;rTNg2}k3W1xHO_>w|&S$E7(DEMm sfSZI=2<)2>sPx$BS}O-R5(wilTmhpKnz7+0`9@;4?8KYL|F-SCE`k?D=Gb`bq_L04KSPmrP$N? z;tb>_HwlD)9(pGJrKS^sDp5IJ7AV7*S-?_}L@r7d`U)V0qBt*P?;*1Q`*2nB!LlPp z#g0!mP1?N)S0ZLALC3F27U+`EE3ne z^<5vAVokNNjqmSP*>9dg69Of+`$Y8l6}#e*-&6m>FTKGJ8#Ip*cS$Lg00000NkvXX Hu0mjfLm86X diff --git a/assets/radar-fill-red.png b/assets/radar-fill-red.png index 69fc410f392b75012a2fe483901b1f7d45a45aae..bad5e6dbb38f859335b8df855122df99d40af511 100644 GIT binary patch literal 492 zcmVPx$rb$FWR7gv;RZDKdFc5u4ttht$CuukXLF$fh3-4%mxdn9B1)L%2N#GWgwu+mH zacz@vVhNF@6Ti>Qn~A`kA8}`V+(dAe*&0xJ4Y8UOyNVOb5`4==u24S%BDa^+5kOT# zyc5_-z9b|39_W1y%%TatWL63w4V7+O>{?OwJGC7b`&HHeq5&4er(!oVK(4DAk2AMi*Ckq$3V=_B zNe(B#35b^}k6_5IPE?k1nGcn?Gia_|H>xo!#X7XnWhYs$04i1cbQ%{TJInbc<^u!- z;FG9h-@Y-!XjX?C^WJ5r>-tmD@M+b0!kZ?4nm$}=zqF41fCLFlGcAD1Em5dQ-Sn{p zp+x8%q?QUI5m1RH)UGZYz#B3;V+mq6WlXX<1n#En+etCttb?Kd0SDYCq~pMje5}U) i?R(QdIYz?W3H|^x9S0~J;urY<0000Px$7fD1xR5(wilk0VZFbsvSWM>aHDVZc;5}HXuCJCLSbdF%D$i+T9LP<~k3xxIQ zUP%!CdFYk=p6CvuPDO49pq=LI0u(5Mb0t*Y0F=Xfa}c>C$S%Mx_RLqS?tv~a-v?0Z zMJoH20al5CZfPkhV6IbjFLE=8id1GN1Cq}~PM`-++HS1&9jUeIokuAvDkYz4R~q(i?mOfPjk;axOn100000NkvXXu0mjfF2;*h diff --git a/assets/run.png b/assets/run.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaf23d8e0a4ad220ae4c4b5434d94b5963e782a GIT binary patch literal 1145 zcmV-<1cv*GP)Px(Gf6~2RA@uZTI*38F%Xu{CWJ0bB|r_3nfx;@073^q2LuWL{xK6%1EvzL3qk^? z+)DS*W3?;Y*-ZQcW_-HUe*1n{iZy*s{(L(wRJ8}>lo0!dtelzus?>j#ETt5yq7u(S zOv|gC2mSq+j~w$dFfA%IubFBX&ZDN3ScyX3Pd+BApXia0w5%RalO5~93pY*xdmDaI~s;fAQR^EGoI!H1qA9hKIjTA&BX&@7Mu=lix>AzEgdMerF zFE(8;BN^J)Am_CbpJB32hI1q&H{IDV-@wdBB4H}odGP?y3m}$JjrIU&UUv8U5#0p& z_Me+|Llbm0*oN12X~Xt6@Pmy5;Od*^d9v1RKhOaD2x4cslnBIWz@|ZIBUSUhBL@I- zA`s^TF#)91II(wqlmAo=^yU<{sa)sPzKZ||V{1+gvpy3FYkf=$t_i79hRGqX>q-Sc z4+qlgF4t#Ox$!7Ohfyu#`}kn1m5N_l!1t+zR*q!3v$0W)KdXuicSDE#Oc3}+ z2+tvr@j5;oURPA1BM!b1N*=HGri2c9#n5dcXEIHu#fHnI36t}m*v6#wi=1sDnWXgg zvpUC05U$l^2UsSI;l!b~fhFHiAl#yyV;+RU0)RvGe8~d<_g&Qa+-R2tpuN~ML9p9RXN+^=+(xRUHwZviqjW#^h;Q8~ z#@p>ax6Gz#aH2_k-n4srWPx&Wl2OqRA@u(nQdCzFbsgD5bn`-yT{s#Ea^#rlaTBpbobaw?m-q0=L=VnZP_s! zeIEP=3XP*zUzTKqD_?l!^1~;<|F&Rq3zTZJ>7m+u1E_}I6*l@ub^Gg-8aN4n7P@P* z0ujnrIR~NbOT(N{WpxUmRRG^#c6W$yze1~xQc(T4JwL?m5d~1beBCST9tGN#%GDs? zLzVxoqz_Er3kE3KofcfX3b%TVW{~}aylpCM8X6M{x&i?A+`~%2eW*3W09p|B2OpW2 z2fKkMW*WTd4jNu!4KYB`Zl9>|F&Z<4GC*h?i6KM)jPMPr?3f~pXrRHm+0$iAsZ*Ul zAADBu0x&+`)cJYq+c@<9JOosAem=VPasrImMr&qTV$+5K*ero6JGd6F>8wE=5`8HFM)Xu9Y^21_ik0Ce-z+V=@>1oRvWHW#)5nC|0EWg%AJ z3P4+OAW4LEBO8F4gmMK?h~T|eNn+4{b7i)L8{KqUT4F2!Xc|kEIzxr;frqMhK8HA2 zmH24a7mv zUfH*YEgeUtQN7va0pf2gJkyEjgOFCkTs*P|84*a-z*r!ng&!387QlKg#x*y5F-Lt* z;J-|NyGr;~#oS15)jKSWti3}8UqF_Y$>?tRD0WaU7D&*k-ag%@r|dXwubLINvfXc6deUHxm3Wtm<=S@{pd!~0JQZR zV4UtTJu=_oq!`a90iZDb=WDuVl{)%+d@s2L-a|;&o}U2!TI2M6e*r<>xleUq;^_bY N002ovPDHLkV1f?yuGs(p literal 0 HcmV?d00001 diff --git a/assets/warning.png b/assets/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..11af30e445522d21886ae6c07d12ee550bf45e4f GIT binary patch literal 761 zcmVPx%vq?ljRA@u(nO#!CFc8PHya>0@lW6fGat!c6eGrbJ9z?*CSWf}IbaiXPv`doi zHtAGm=!-KpZTGid|4jgM;uoB_{pJiXbOg^42t{DGS>4e6NjBg16{%h#u-mLI0rABc zQv&?{-6FtjlFjqfAiV(W*UL|1%q256M}RCfL~?-LX7vDwk1kImz~dyFKc$R9Qh+LT z$oux%0z!^}clI9$aFsF&sR0_^Cu7NQK-}1rN*#q{0Nnd^LwQ=Ij6yPi{d!4Wwp}M5 zPZy>4>8jukQ2>P3i`)4uMJ*%&pnhMaNokWSP5O#L5&+gV8{V&bnXOBr4bcEco<*EZ zZtq`R>7iLGO|NKx{d$SDk9oas*YIe?idz(bBdZtgv$(|o9Enz4VM74Ct;UF3CxDP>Ng`0CSkM8| z%;*FV5-lkJt>bOAo`SsrNQ*F(LN$eMMj_CGeL(66NJUEm;D~~H&!7U(2$2+E_x^kb z0JMAajv=9R5(7BeW>B=G0I^Zf0PwDH5G|L7Gyu}Na(zbxz`ZXShcy6XSXXhA0yMlo zo-SIS(*krAw^lw8urZY}_R#&bBJ>chyEchWIE9f~1tVWi5didH00000NkvXXu0mjfx-nHZ literal 0 HcmV?d00001 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