From afc4476eaa1b11a8fead26d939d79f59350fb0c1 Mon Sep 17 00:00:00 2001 From: wanghaoyu <1580258873@qq.com> Date: Sat, 7 Dec 2024 17:38:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=85=89=E7=94=B5?= =?UTF-8?q?=E5=90=8A=E8=88=B1=E4=BA=BA=E6=9C=BA=E4=BA=A4=E4=BA=92=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=8F=8A=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PayloadAPP.pro.user.ed0dad3 | 273 +++ Src/GDDC/GDDC.pri | 3 + Src/GDDC/Pod/Center.png | Bin 0 -> 5632 bytes Src/GDDC/Pod/c.png | Bin 0 -> 7851 bytes Src/GDDC/Pod/circle.png | Bin 0 -> 5970 bytes Src/GDDC/Pod/plus.png | Bin 0 -> 10185 bytes Src/GDDC/Pod/podDown.png | Bin 0 -> 4579 bytes Src/GDDC/Pod/podLeft.png | Bin 0 -> 5340 bytes Src/GDDC/Pod/podRight.png | Bin 0 -> 4979 bytes Src/GDDC/Pod/podUp.png | Bin 0 -> 4362 bytes Src/GDDC/Pod/sub.png | Bin 0 -> 9788 bytes Src/GDDC/gddcCmdDlg.cpp | 85 +- Src/GDDC/gddcCmdDlg.h | 9 +- Src/GDDC/gddcCmdDlg.ui | 4306 ++++++++++++++++++---------------- Src/GDDC/gddcStateInfo.cpp | 6 +- Src/GDDC/gddcdlg.cpp | 1120 +++++---- Src/GDDC/gddcdlg.h | 132 +- Src/GDDC/res.qrc | 13 + Src/Video/cffmpeg_decode.cpp | 2 +- Src/VideoGL/videowidget.cpp | 5 + Src/VideoGL/videowidget.h | 2 + main.cpp | 3 +- 22 files changed, 3399 insertions(+), 2560 deletions(-) create mode 100644 PayloadAPP.pro.user.ed0dad3 create mode 100644 Src/GDDC/Pod/Center.png create mode 100644 Src/GDDC/Pod/c.png create mode 100644 Src/GDDC/Pod/circle.png create mode 100644 Src/GDDC/Pod/plus.png create mode 100644 Src/GDDC/Pod/podDown.png create mode 100644 Src/GDDC/Pod/podLeft.png create mode 100644 Src/GDDC/Pod/podRight.png create mode 100644 Src/GDDC/Pod/podUp.png create mode 100644 Src/GDDC/Pod/sub.png create mode 100644 Src/GDDC/res.qrc diff --git a/PayloadAPP.pro.user.ed0dad3 b/PayloadAPP.pro.user.ed0dad3 new file mode 100644 index 0000000..68acc19 --- /dev/null +++ b/PayloadAPP.pro.user.ed0dad3 @@ -0,0 +1,273 @@ + + + + + + EnvironmentId + {ed0dad32-f81f-4133-8ec2-4a3277169847} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + 0 + false + true + false + 0 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + false + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 10 + true + + + + true + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop Qt 6.6.3 MSVC2019 64bit + Desktop Qt 6.6.3 MSVC2019 64bit + qt.qt6.663.win64_msvc2019_64_kit + 0 + 0 + 0 + + 0 + D:\WorkData\Code\PlayLoad\build\build-PayloadAPP-Desktop_Qt_6_6_3_MSVC2019_64bit-Debug + D:/WorkData/Code/PlayLoad/build/build-PayloadAPP-Desktop_Qt_6_6_3_MSVC2019_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + D:\WorkData\Code\PlayLoad\build\release + D:/WorkData/Code/PlayLoad/build/release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + D:\WorkData\Code\build-PayloadAPP-Desktop_Qt_6_6_3_MSVC2019_64bit-Profile + D:/WorkData/Code/build-PayloadAPP-Desktop_Qt_6_6_3_MSVC2019_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + 部署 + 部署 + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + + Qt4ProjectManager.Qt4RunConfiguration:D:/WorkData/Code/PlayLoad/PayloadAPP.pro + D:/WorkData/Code/PlayLoad/PayloadAPP.pro + false + true + true + true + D:/WorkData/Code/PlayLoad/build/build-PayloadAPP-Desktop_Qt_6_6_3_MSVC2019_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/Src/GDDC/GDDC.pri b/Src/GDDC/GDDC.pri index e1f1fa2..4c70390 100644 --- a/Src/GDDC/GDDC.pri +++ b/Src/GDDC/GDDC.pri @@ -18,3 +18,6 @@ FORMS += \ $$PWD/gddcSet.ui \ $$PWD/gddcStateInfo.ui \ + +RESOURCES += \ + $$PWD/res.qrc diff --git a/Src/GDDC/Pod/Center.png b/Src/GDDC/Pod/Center.png new file mode 100644 index 0000000000000000000000000000000000000000..bc47abe3c187823b1b16db642e26d1a94928fdc4 GIT binary patch literal 5632 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 literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/c.png b/Src/GDDC/Pod/c.png new file mode 100644 index 0000000000000000000000000000000000000000..a5543982bf4e5a7cf57ea38193ae90242861a1bd GIT binary patch literal 7851 zcmbVx_ct8g7p*dwL6}jZGlQZ5xtWL z;`zS+;JqL2y=$Fy?p=GGyVfat$Gp*e^@Na?5DN?I$!irwoyT+He+!8JxYz2}6<}d8 zdc0PIz4b9YG9e8xR?08*b^X>d8;0YY+7hZZdCV?C|HkMt_92!moLss^2{I^JNID)m zN6779v?=F&5L~QxCY}CvgxndTr37W909*;m%sS?*fBvxD@LJRv?U9zk-tBrUmCM%> z!7g?3xkt=(qvs1jC2~is|7Iq@+a~BDcO!}Hf(Ag0^GYd%)`=JgKeUw99B6411v94y z5W_xQ3IeH7SrX=8x2O;U*xIIzgAxE+Avv13W$%O3qr?A;1w4u?)6HReLa}5|Qv5j$ zZ9nos#Lh$5;!jk{iq6Hivxf@CDnizG0_E=n9$e$U=BG7D|7%DR-!`x`@Q?oC#3Oz) zf1J^mx5ck$*uxxMwpqW7@u6+CdtUlX6C{KCO;S^iF#4s_mYTz{wGbOi`6-i5eB%pN zccLIPH2Z4%;NdnE=Bgq6WfG0{@1AW;DpZ1(BLYuz5}8+8Ny2 zS8d1n{~?UgpAfP*kx*-M5t)S-(>4(|^G$O2qJ`qbBSi%5udG#OOH`gJ9*46VeT|w4 z7{qi{NZg~I=GfPSGf!yab708pgF?T;^XO(2(D1wAcD3{ip>zM_o?(_Ut0Jxo{hvs6 z7cF8~;y^Qdst+r>29K4JPLCe{nxQJ)7`!ITplsMCEj6Oh_7g&W01S|uFU#4{f9hyW zB1O6i){OtbBB|iT2+NRxjBfsPd6ffInoiZ&AaeX>3H9)s=NPuQuh`b!N%prCU0o}j zIF9EQML$z9@%|BD`So{`kmU=d_ovhQVr&l)-I@OMU~2@+su4V&keh-F_36+>dKE`V zl}A|tFQN3j&b;If^sDJJKyi|-X*FH!<7-?rbfTq#?t@+uJdpnO!13#*eU3Sksz@wV zDoJzt*!9O=a3UzEq) zl@4NqeacX6w|~(mYk~2INQBy`QSy8Al<@ga3}!eYCfbaPSyW88gCt5XNkSNj4qn7` zVBBhL5!*S z^<$a4E<#?EroIDkF6&U|BhiV+7b}qPdiunlHC#&MXlXL#yfL6tJfzFdR`-J$2SY21 z%GoE_GOd1fyjHqq^N5(qt{Caad3B-V+F6gQhURRtD1fFJjuzRGtDBw&s*tMoXZdqC z=kz2|;LLq*uxW)(EM;4fO<1URN~*^ey_cIkrXxs|DI_%{#RQ!Ke0{WQyu4m+z_Zol z7;M5xB;PbKonR28qPDJ24D$y-I=QdcfF1#&c2M=(9A>#me#L4tnfbJPm*gBg)#Q{P zn|@g4YYSm{cz@dxC`gb>bzBz*MQ@4Yp=_B~tF!JGvs@p)k}7o{{)d-a3*_E-4Fzz? zda=aU(~srR#lEKPNTKu4kh!zSJ28U-DqoMke3CTtzVEl_AN;5@A5J_Tjf{s?j|pr= z9{MM;gvf(aO-Dt#mKL(@A;3znGZ;Q9Z$CQMZ5JTQE}gS(?+m zS6eFappTUBKBzqEr-$_-q5_o$1G?NB40`)BJW!{c2lFfeS3pPT-mA^?1_(dtk+`F{ z1^W$beSFTa*_t}DT%4R;VWpxbLQnC1q-i-|lL}QDz8F_jx_%y9&iHO zdq#_JE^v=qS=70s6(IUSN_{-n7q!cYsG_GU2Y}87dy*)Z2qH~0@55A2-=h=s{teA> zGf7@FDD3*bb@5M!lp&cX+Tojx1%jw)nT`SR#wShuS4ieTML#!%Sm$q!7U3OEB~5*I zz|pP~i+Yl<{Vuv+!*uBc94^VVHAvrhrzXCp4=v+#NMNdbh`d zO`|r~DgQbvZLRmY^PwV@f8M)I|Lam`OP}DD>`Q1ncG;WeLYpzm`yRiNf{*srcjoqD z3UM-hDgl-MtMiBZ0avrD<>7OMV~2P9`3X{fmyGT*Ej)ey%8-0*MnqS$yPSrC=U7sL z)@QRc!9m&?1v(&9^SH(m5r#!gLdoN}najYrP0w<7@p439Xf>mC$t9m1{_SKA$u-0B zGI^m&8s+w~(BOXkjryv8Qc9}>Gs!lW0haP>O=`w&_rlKN4+XwWV@kA-DKp{Ma|gVq zfhELp=MC_Ds~SCPsE8&+v80p2AmU*?m!h?G6E8F~%A*Hb1_7Ma2F3pLj#;Ve&LGJY zy#C5*hSQ~dEW*9`fy`{ocbi<;S~Y!iBGcouOkoPME+Opu%s*wI9~MBuG*ai>x}pAO zPLoAvCVC@ql5Bj7QVP3y6I<_*!zFAf3(xuHZm)p@BFY zNud(dLY8g3niM$mx@W16^<@XPA*i-wLJOcm=MslX7Jj0I+yJ-h9^C2)VZC#iiS^gK z*E7Z}-Roh*C)yef^B8=pJ-HH$#_ZWEv~F*$4wIBG4Kn+^8uPoG=1BZ(59^7co*tKv zol%A9#=!*$uv5Lyxzf>=v4vhYzH3JR5iN~wqZ0rr6E@XBex{gAlRc6x$|?=cgPTFJ zLYHmPo^4R9;+wauv!}@6?M-ym15E0#37OP2y#PL~761nA$UWPAFndcHk{qBKX%K2G z{G$C=ru>zv>wqO@WSZAc^y|Tp*?=x+Q6YJ0cZUH#D5Zmda-($G9Ljol z6Xw}Wx?7U;H4Njt5<6E*4Dj9WoS~!OF7>IO(Dhmw8a?)Z zyCg_pIH<(Phw0_>f>fj^G6Ti#fRM^vLlnQd~zvW$w z(cvJRi}iN5u%HC$w^OPW?g~}GZ>+7?|1&y`$LNxKVP@<~*{qnJCM2+HCL`(Hwe~3e zkU96XznN%n!uCRAMGXZlSxr3!_|qTYMETS=&rm)A28vV`sQI$@UAPt-0N7C4j>bDD z?h;<$dEp;eU^ioaaXYl(>N86hkR0F*m8Q;o>dODU{KnVE9>Y0jp}S}XXqnP`{aT8* zz?lUIBroI756FXfwW+XHO$~+nEWFX(*?2oC=F!VqL=HQpzco9fzjZ*Hg2)vsjF1MK zY)V+qtw+HFr2CS0ML~u&898$=EzPFEeui3Wwv{#J(u0;%(FaWf>QtP;`S-lBtLQYSzGtg(|TmQXFDp z-AZM{A8Pu6^IjYokhs&?GRc6z4zXO;l4v@VbP|3dxxJ#E!MHo7#nGi+nX$CWkJhv^ zdObko`d|COEN)%|Ba_1vp*1s@Lxo!?B>BJhlE|f!?Viwgq`{pwvKo*9!gEj!R6f&l zs!M(nSMZ`hfW<5eDvq=^mr;%WA4D9H9;#5`LnDJ^G;aOVL*6H9r|aE=CthaVGS|31ro5D2N1wnLm2h1l z|3jR*B}dtGzRi-nCI*@RJAD4k53Sgbhe%C|RspjE=dd5Tjr)H`6&Haq=XM9OEvdZ>7q zTkf?m&0oJv7}HovWlY7#-K;W=x2<8!~vwhE{W6~B*UUs;Ja2blnD-BHMKSN5k1 zZ1$Rr@EC41Np90WX2GMq$C2YzRX8T3dY;5~kq(`4a>3#ZBv))Na&ObM+b`@^C`352 z>>_-Yv-h?~pIWSBZD!+b^oD1h6bQmp4K$b*t(~$J_=Wctku(XzR|83V>Eav?7xcw) zlRfK`1r>_3Wb7(JJ-yZ-rAV;0N)PWn?+kO7)6K|2{dZbPnL6B0xQ$k(u_w~LztmWg ziO2yo8Wqf?_D>V?p3Nn9HSL&mNjj~o$^H!1lCXH!@i!@XcGom^J|}6jhdUscLmgZv z97Izv&>vnp|N7{dXUK~@obf7UAAvSSKb5MM3M#PD&fj8l1;8?5NMempb{G7;OBQh^ zsM+gWMJd;*Y6UD=|7zb)Snv6Os$T8{Lq={&;B{UDabOS?Ris~d2L*k*Dqr354KB^* zgoxl-kP(F|0x;<8N4G}MC$N&$bSkh^f%`v-T){@9#>pslR)fn2jp~!sa!@0nF{bs*NxehqQrZ3jU!HBkW`c)=(fyE%-3B{hz!t353K3vL)*iLR|3a>)1** z07v%}Bfz6qy9;cu7hWLG((FVTh`gkgPe_-7ufuXg>S!pw~*wvr=JPQ&|RLz^dQA&h<0 zvASmSGvW&!Oc=N~^a8Z!!8w-JviVcLTXiYna2WFONE3sT6q$=0#^XOe8M_}BSlfTB z>y=}kz*a_&)s8AZK}KnPw;ItJ7Tl^8K@T%nk&XY|Nu|b(n(lg2;FE21=Ipfe>0_^9 z!l!#wg(hf>-96j+lWZ{kd#J&<<~g~642~h5jd%db9oTa~SM-GzfJQ3H+@9?(U+of+ zEq%qTjeKeq8?Yujb0}vLku>RGxM*~ zCQxLKT9210A!1%fYD%^F$4@X_-0xl|lXQs^r+eX(>zwc>YQcYxB+A+pjciOxoOKCsz+>7FZEK zt50pW(aRd+tuEz8uX+;`C{S)}VA#p+QbVh+o{CAJ*K-`I;UaTc0ie1+Sz}#d%zEVd zO;pc>wgJ`4=t3Ix>l*aeNa@D}L&aQ_C%PG8ikl~0dWkB2r~Lduh-P@VkeFe^kAB%- zY%?%1vgieh0)a-NUY5*Fi5)~Io(vCX6P>#42t9mw`?KZkxBQM|!*Bvr+}q?4)|Kry{q`xiyT1U6Lu)(=Dhw^_s1i>N`#|)}AnFA??r?Wp1 zdg+?UTihwCYe1!!Ji6M}O`OZh4A*#f=WFFP31Gsp9~B3ir<0S#C)q#1#_skv#e*LX z^P7s{^5Bt^{JS}o1!%ZdYHb6H?{F5ev&#k_&m5OvBbzRNaC&89>;4-bJAN_2gLfV? z89h$3Y2dPs*xhuy3f{HvYd!~W9uDc=Vwq&%U{i6+m@S3ePc?<;K^zK%ykvM0sx=k+ zz&Xlbh8Rkwue;7)B|SJfmxMTI{P|Cb)5tA51L46xNEV|XRV#+0<;^220nfJB4yg4#b0DC%TRtu`4NH=HdBv9Ql zEk6a)S#z)^D;)NRAc~nxuGN%UDcmQhJUf?P5+5-4*_lX#yK{67bS*mm(7A%$PZ~Ww za^2!l;s$b%Lq|itj;6ZW|pv3j7r# zf9;kK@d{Gaf6b3?2|XHM46H($;?wN>A!^EAFIgAItk@IQHpD7ieYUvwRVhw{YtU?N zY7a$lF5tWO*(t6+YHviEMl_y{w^N4m=+O5pO{D%QopDuWA9CvH-w1Qw7TA1psWM2@ z8|^TUfKJlJ8X>}y2OKj4jOGRte>nCH&o zAoxC%QD}$@Y(o^#`#3iu>1guPuKbEcp4fL((0@#nYH?$4^L9nCIY3sNI5X9m`P=Kw zr7pb2{e1~NHe@$IL;fGETp$}@4#4phlFp?@w`HK<*O6t(FEH}i!Fu0j;JWP^ryrA=gUa76 zcDUYWWP36zgro@k{A*jkc*GUz1=t*(3T(4%L>KCnHJeQA)C%mMzZ1J}epy5(G4@nM zqyI0`L)5YZ%1?e9{ehddwTD$Oo~GmJwtfYxL<>6*aU71(O{(V~fs>7$;>-k4Mq<_I zIq{)-?LDEvd;zT{FjM$7$4H&j^G33nfa=qY4{w*A#W;BXHJ`$h5SA9tUo89w;2K0^ z#+pTCzRP=742-C}`bbbo-_P7WVaULbJsryY0@c4ye!7b)K)xMCzp|_o?fY~tL7evUpsq*#;RrR&!#k5&xtxM{=v_UH7Ff-`$zc~ z$M>UIMk%k3^(42VzAM5fdi0M^L><<+j;W#+!re=jf>5-@ZC*d@<)s=8y7xH`U>1gr z00|&xini%sjAcoMN`d9Xp(5{GqF_;f3abe}8W2#7{K|XqvM=lipUjZOE4Ge<%pW!@cF{?I*aU;zH3M zBJa%%HF*!2Oyb=X@;Fc8r_70dr=q2W!<@(94xY!8hcerNz-fj?ffRtRZ#W)m+e=k2{1c;6#48~3qeYxXsoyUu2q;?hv@JgqZh43|Qaai| z)V4nL=YfEJ^~dac@!RP{HXt@ z!O{x?I}`?LpvP{{TUk&c%qoibE68sQj}HGomIu=C`pP$6_9<(RA~e=(B~8UTd2`hN E0kwFxUjP6A literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/circle.png b/Src/GDDC/Pod/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..06f5c53a32adedbe283ed062c247582b3ca00cfe GIT binary patch literal 5970 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 f#^Sf;hl)6uO~j-x22_Pk2gH2D7j7qltr literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/plus.png b/Src/GDDC/Pod/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd116aafff6e145545d7fdfbe85b54d6accf24e GIT binary patch literal 10185 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 O8vt6z2u0O;`1(H^i9DqM literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/podLeft.png b/Src/GDDC/Pod/podLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..960f52c95003c0923792f8171f8bc7179b9ab9d8 GIT binary patch literal 5340 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 E0gWIC&j0`b literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/podRight.png b/Src/GDDC/Pod/podRight.png new file mode 100644 index 0000000000000000000000000000000000000000..111946ab08d658de348f43aa113286ce799be6e2 GIT binary patch literal 4979 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 literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/podUp.png b/Src/GDDC/Pod/podUp.png new file mode 100644 index 0000000000000000000000000000000000000000..f207e6791dccd4a2de6bb2a2ca6817dff2d7e253 GIT binary patch literal 4362 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 Q+;LE$RCQE}lre$-0V4eZ$N&HU literal 0 HcmV?d00001 diff --git a/Src/GDDC/Pod/sub.png b/Src/GDDC/Pod/sub.png new file mode 100644 index 0000000000000000000000000000000000000000..927ae7e7c7cf858ee2d2782eb4d06c180362804f GIT binary patch literal 9788 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 GDDCCmdDlg::GDDCCmdDlg(QWidget *parent) : QWidget(parent), ui(new Ui::GDDCCmdDlg) { @@ -107,6 +108,10 @@ void GDDCCmdDlg::initParam() { ui->lineEdit_6_1->setText("960"); ui->lineEdit_6_2->setText("540"); detectionAreaSetting = false; + + ui->spinBox->setWrapping(true); + ui->spinBox->setValue(5); + setPodIco(); } // 设置tabwidget的几何位置 void GDDCCmdDlg::setTabWidgetGeometry(int ax, int ay, int aw, int ah) { @@ -337,27 +342,31 @@ void GDDCCmdDlg::on_pushButton_3_3_released() { clearTJDCCmdBuffer(); } void GDDCCmdDlg::on_pushButton_3_4_pressed() { TJDCCmdBuffer[0] = (std::byte)0x45; TJDCCmdBuffer[1] = (std::byte)0x01; + TJDCCmdBuffer[2] = (std::byte)ui->spinBox->value(); } void GDDCCmdDlg::on_pushButton_3_4_released() { clearTJDCCmdBuffer(); TJDCCmdBuffer[0] = (std::byte)0x45; TJDCCmdBuffer[1] = (std::byte)0x00; + sendCurDate(TJDCCmdBuffer, 1); } // 变倍- void GDDCCmdDlg::on_pushButton_3_5_pressed() { TJDCCmdBuffer[0] = (std::byte)0x45; TJDCCmdBuffer[1] = (std::byte)0x02; + TJDCCmdBuffer[2] = (std::byte)ui->spinBox->value(); } void GDDCCmdDlg::on_pushButton_3_5_released() { clearTJDCCmdBuffer(); TJDCCmdBuffer[0] = (std::byte)0x45; TJDCCmdBuffer[1] = (std::byte)0x00; + sendCurDate(TJDCCmdBuffer, 1); } // 可见光镜头初始化 void GDDCCmdDlg::on_pushButton_3_6_pressed() { - TJDCCmdBuffer[0] = (std::byte)0x41; + TJDCCmdBuffer[0] = (std::byte)0x40; TJDCCmdBuffer[1] = (std::byte)0x03; } void GDDCCmdDlg::on_pushButton_3_6_released() { clearTJDCCmdBuffer(); } @@ -380,12 +389,16 @@ void GDDCCmdDlg::on_pushButton_3_8_released() { clearTJDCCmdBuffer(); } // 低照度模式 void GDDCCmdDlg::on_pushButton_3_9_pressed() { - if (param_pushButton_3_9) { - TJDCCmdBuffer[0] = (std::byte)0x4A; + if (param_pushButton_3_9) {//关闭 + TJDCCmdBuffer[0] = (std::byte)0x4B; TJDCCmdBuffer[1] = (std::byte)0x00; - } else { - TJDCCmdBuffer[0] = (std::byte)0x4A; + param_pushButton_3_9 = false; + ui->pushButton_3_9->setText("低照度模式"); + } else { //开启 + TJDCCmdBuffer[0] = (std::byte)0x4B; TJDCCmdBuffer[1] = (std::byte)0x01; + param_pushButton_3_9 = true; + ui->pushButton_3_9->setText("低照度模式关"); } } void GDDCCmdDlg::on_pushButton_3_9_released() { clearTJDCCmdBuffer(); } @@ -646,7 +659,7 @@ void GDDCCmdDlg::on_pushButton_4_17_pressed() { TJDCCmdBuffer[1] = (std::byte)0x00; TJDCCmdBuffer[2] = (std::byte)0x00; } else { - TJDCCmdBuffer[0] = (std::byte)0x58; + TJDCCmdBuffer[0] = (std::byte)0x53; TJDCCmdBuffer[1] = (std::byte)0x01; TJDCCmdBuffer[2] = (std::byte)(sel - 1); } @@ -870,13 +883,13 @@ void GDDCCmdDlg::on_pushButton_5_15_released() { clearTJDCCmdBuffer(); } // 框架 void GDDCCmdDlg::on_radioButton_5_1_clicked() { paramIsFrame = true; - ui->pushButton_5_5->setText("归中"); + // ui->pushButton_5_5->setText("归中"); } // 陀螺 void GDDCCmdDlg::on_radioButton_5_2_clicked() { paramIsFrame = false; - ui->pushButton_5_5->setText("自动校准"); + // ui->pushButton_5_5->setText("自动校准"); } // AI开 @@ -956,3 +969,59 @@ void GDDCCmdDlg::on_pushButton_6_8_clicked() { ui->pushButton_6_8->setDown(false); } } + +void GDDCCmdDlg::wheelSwipe(int value) +{ + if(value > 0)//鼠标前滚 + { + on_pushButton_3_4_pressed(); + } + else if(value < 0) + { + on_pushButton_3_5_pressed(); + } + else if(value == 0) + { + on_pushButton_3_4_released(); + } + //qDebug() << value; +} + +void GDDCCmdDlg::setMoveParm(QPointF size) +{ + int x = std::clamp(static_cast(size.x()/10), -60, 60); + int y = std::clamp(static_cast(- size.y()/10), -60, 60); + // qDebug() << "缩减之后的屏幕滑动参数==>" << "x:" << x << "y:" << y; + TJDCCmdBuffer[5] = (std::byte)0x70; + TJDCCmdBuffer[6] = (std::byte)(x & 0xFF); + TJDCCmdBuffer[7] = (std::byte)((x >> 8) & 0xFF); + TJDCCmdBuffer[8] = (std::byte)(y & 0xFF); + TJDCCmdBuffer[9] = (std::byte)((y >> 8) & 0xFF); + //qDebug() << (int)TJDCCmdBuffer[6] << "---" << (int)TJDCCmdBuffer[7]; +} + +/************************************************* + * @func + * @brief 设置调查控制页面图标 + **************************************************/ +void GDDCCmdDlg::setPodIco() { + ui->pushButton_5_1->setIcon(QIcon(":/img/Pod/podUp.png")); + ui->pushButton_5_1->setIconSize(QSize(53, 53)); + ui->pushButton_5_1->setStyleSheet("QPushButton { border: none; }"); + + ui->pushButton_5_2->setIcon(QIcon(":/img/Pod/podLeft.png")); + ui->pushButton_5_2->setIconSize(QSize(53, 53)); + ui->pushButton_5_2->setStyleSheet("QPushButton { border: none; }"); + + ui->pushButton_5_3->setIcon(QIcon(":/img/Pod/podDown.png")); + ui->pushButton_5_3->setIconSize(QSize(53, 53)); + ui->pushButton_5_3->setStyleSheet("QPushButton { border: none; }"); + + ui->pushButton_5_4->setIcon(QIcon(":/img/Pod/podRight.png")); + ui->pushButton_5_4->setIconSize(QSize(53, 53)); + ui->pushButton_5_4->setStyleSheet("QPushButton { border: none; }"); + + ui->pushButton_5_5->setIcon(QIcon(":/img/Pod/Center.png")); + ui->pushButton_5_5->setIconSize(QSize(53, 53)); + ui->pushButton_5_5->setStyleSheet("QPushButton { border: none; }"); +} diff --git a/Src/GDDC/gddcCmdDlg.h b/Src/GDDC/gddcCmdDlg.h index 5d12e09..15c615a 100644 --- a/Src/GDDC/gddcCmdDlg.h +++ b/Src/GDDC/gddcCmdDlg.h @@ -1,6 +1,7 @@ #ifndef GDDCCMDDLG_H #define GDDCCMDDLG_H +#include "imageswitch.h" #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include "imageswitch.h" #define cmdLength 44 namespace Ui { @@ -230,7 +230,12 @@ private slots: void on_pushButton_6_7_pressed(); void on_pushButton_6_7_released(); void on_pushButton_6_8_clicked(); - +public slots: + //滚轮 + void wheelSwipe(int value); + void setMoveParm(QPointF size); +private: + void setPodIco(); }; #endif // GDDCCMDDLG_H diff --git a/Src/GDDC/gddcCmdDlg.ui b/Src/GDDC/gddcCmdDlg.ui index 36b1072..fd9a675 100644 --- a/Src/GDDC/gddcCmdDlg.ui +++ b/Src/GDDC/gddcCmdDlg.ui @@ -6,12 +6,12 @@ 0 0 - 1355 - 219 + 728 + 830 - + 0 0 @@ -35,13 +35,13 @@ 0 - 0 - 1121 - 211 + 10 + 471 + 785 - + 0 0 @@ -55,7 +55,7 @@ 16777215 - 220 + 16777215 @@ -74,13 +74,13 @@ - QTabWidget::TabPosition::North + QTabWidget::TabPosition::West QTabWidget::TabShape::Rounded - 4 + 0 Qt::TextElideMode::ElideNone @@ -90,1773 +90,106 @@ - 系统控制 + 控制 - - - - 680 - 40 - 100 - 21 - - - - - - - 吊舱时间更新 - - - - - - 10 - 10 - 241 - 161 - - - - 目标跟踪模板大小设置 - - - Qt::AlignmentFlag::AlignCenter - - - - - 70 - 130 - 91 - 21 - - - - - - - 设置 - - - - - - 110 - 70 - 113 - 21 - - - - - - - 110 - 100 - 113 - 21 - - - - - - - 10 - 70 - 81 - 20 - - - - 目标模板宽: - - - - - - 10 - 100 - 81 - 20 - - - - 目标模板高: - - - - - - 110 - 42 - 111 - 21 - - - - - - - 10 - 40 - 81 - 20 - - - - 类型选择: - - - - - - - 260 - 10 - 231 - 161 - - - - 视频显示模式设置 - - - Qt::AlignmentFlag::AlignCenter - - - - - 70 - 130 - 91 - 21 - - - - - - - 设置 - - - - - - 10 - 82 - 211 - 21 - - - - - - - 10 - 50 - 101 - 20 - - - - 显示模式选择: - - - - - - - 500 - 10 - 171 - 161 - - - - IP设置 - - - Qt::AlignmentFlag::AlignCenter - - - - - 40 - 130 - 91 - 21 - - - - - - - 设置 - - - - - - 10 - 80 - 31 - 21 - - - - - - - 20 - 50 - 81 - 20 - - - - 光电吊舱IP: - - - - - - 50 - 80 - 31 - 21 - - - - - - - 90 - 80 - 31 - 21 - - - - - - - 130 - 80 - 31 - 21 - - - - - - - - 载荷公用 - - - - - 10 - 10 - 100 - 31 - - - - - - - 图像切换 - - - - - - 10 - 50 - 100 - 31 - - - - - - - 抓图 - - - - - - 130 - 90 - 100 - 30 - - - - - - - 开始录像 - - - - - - 10 - 130 - 100 - 30 - - - - - - - 停止连续抓图 - - - - - - 130 - 130 - 100 - 30 - - - - - - - 停止录像 - - - - - - 10 - 90 - 100 - 30 - - - - - - - 开始连续抓图 - - - - - - 130 - 10 - 100 - 30 - - - - - - - 选点跟踪 - - - - - - 130 - 50 - 100 - 30 - - - - - - - 取消跟踪 - - - - - - 250 - 10 - 100 - 30 - - - - - - - 单次测距 - - - - - - 250 - 50 - 100 - 30 - - - - - - - 开启连续测距 - - - - - - 250 - 90 - 100 - 30 - - - - - - - 停止连续测距 - - - - - - 370 - 10 - 171 - 161 - - - - 字符叠加设置 - - - Qt::AlignmentFlag::AlignCenter - - - - - 20 - 70 - 111 - 21 - - - - - - - 20 - 110 - 111 - 30 - - - - - - - 设置 - - - - - - 20 - 40 - 131 - 20 - - - - OSD类型选择: - - - - - - - 可见光 - - - - - 10 - 50 - 100 - 30 - - - - - - - 变倍- - - - - - - 10 - 10 - 100 - 30 - - - - - - - 变倍+ - - - - - - 130 - 90 - 100 - 30 - - - - - - - 低照度模式 - - - - - - 370 - 130 - 100 - 30 - - - - - - - 恢复出场设置 - - - - - - 130 - 10 - 100 - 30 - - - - - - - 自动ICR开 - - - - - - 130 - 50 - 100 - 30 - - - - - - - 自动ICR关 - - - - - - 10 - 90 - 100 - 30 - - - - - - - 电子稳像开 - - - - - - 10 - 130 - 100 - 30 - - - - - - - 电子稳像关 - - - - - - 130 - 130 - 100 - 30 - - - - - - - 可见光镜头初始化 - - - - - - 250 - 130 - 100 - 30 - - - - - - - 恢复默认 - - - - - - 870 - 10 - 120 - 121 - - - - 透雾模式 - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - 10 - 70 - 100 - 30 - - - - - - - 设置 - - - - - - 10 - 30 - 101 - 21 - - - - - - - - 370 - 10 - 100 - 30 - - - - - - - 增益+ - - - - - - 370 - 50 - 100 - 30 - - - - - - - 增益- - - - - - - 370 - 90 - 100 - 30 - - - - - - - 自动增益 - - - - - - 490 - 10 - 99 - 31 - - - - - 0 - 0 - - - - - - - 亮度+ - - - - - - 490 - 50 - 99 - 31 - - - - - 0 - 0 - - - - - - - 亮度- - - - - - - 490 - 90 - 101 - 31 - - - - - 0 - 0 - - - - - - - 自动亮度 - - - - - - 250 - 10 - 99 - 31 - - - - - 0 - 0 - - - - - - - 对比度+ - - - - - - 250 - 50 - 99 - 31 - - - - - 0 - 0 - - - - - - - 对比度- - - - - - - 250 - 90 - 99 - 31 - - - - - 0 - 0 - - - - - - - 自动对比度 - - - - - - 610 - 10 - 241 - 121 - - - - 焦距设置 - - - - - 10 - 30 - 99 - 31 - - - - - 0 - 0 - - - - - - - 焦距+ - - - - - - 10 - 70 - 99 - 31 - - - - - 0 - 0 - - - - - - - 焦距- - - - - - - 130 - 30 - 99 - 31 - - - - - 0 - 0 - - - - - - - 130 - 70 - 99 - 31 - - - - - 0 - 0 - - - - - - - 设置 - - - - - - - 红外载荷 - - - - - 10 - 10 - 100 - 30 - - - - - - - 调焦+ - - - - - - 130 - 10 - 100 - 30 - - - - - - - 调焦- - - - - - - 370 - 10 - 100 - 30 - - - - - - - 测温模式 - - - - - - 250 - 50 - 100 - 30 - - - - - - - 电子放大 - - - - - - 250 - 90 - 100 - 30 - - - - - - - 场景补偿 - - - - - - 250 - 130 - 100 - 30 - - - - - - - 红外快门补偿 - - - - - - 590 - 50 - 100 - 30 - - - - - - - 红外图像增强 - - - - - - 10 - 90 - 100 - 30 - - - - - - - 亮度+ - - - - - - 10 - 130 - 100 - 30 - - - - - - - 对比度+ - - - - - - 370 - 50 - 100 - 30 - - - - - - - 观测模式 - - - - - - 130 - 90 - 100 - 30 - - - - - - - 亮度- - - - - - - 130 - 130 - 100 - 30 - - - - - - - 对比度- - - - - - - 10 - 50 - 100 - 30 - - - - - - - 变倍+ - - - - - - 130 - 50 - 100 - 30 - - - - - - - 变倍- - - - - - - 250 - 10 - 100 - 30 - - - - - - - 自动对焦 - - - - - - 370 - 90 - 100 - 30 - - - - - - - 恢复默认设置 - - - - - - 370 - 130 - 100 - 30 - - - - - - - 恢复出厂设置 - - - - - - 480 - 10 - 101 - 31 - - - - - - - 590 - 10 - 101 - 30 - - - - - - - 伪色彩切换 - - - - - - 480 - 50 - 101 - 31 - - - - - - - 710 - 10 - 181 - 151 - - - - 红外报警设置 - - - - - 80 - 110 - 71 - 25 - - - - - 0 - 0 - - - - - - - 设置 - - - - - - 75 - 70 - 81 - 23 - - - - - - - 160 - 70 - 14 - 21 - - - - - - - - - - 5 - 70 - 61 - 21 - - - - 温度阈值 - - - - - - 60 - 30 - 71 - 21 - - - - - - - 5 - 30 - 61 - 21 - - - - 检测开关 - - - - - - - 稳定平台 - - - - - 390 - 90 - 41 - 31 - - - - - - - - - - - - - 310 - 10 - 72 - 23 - - - - - - - - - - 300 - 80 - 81 - 51 - - - - - - - 归中 - - - - - - 140 - 10 - 151 - 20 - - - - color: rgb(255, 255, 255); -font: 12pt "Microsoft YaHei UI"; - - - 伺服控制步长选择: - - - - - - 320 - 140 - 41 - 31 - - - - - - - - - - - - - 250 - 90 - 41 - 31 - - - - - - - - - - - - - 320 - 40 - 41 - 31 - - - - - - - - - - - - - 10 - 130 - 100 - 30 - - - - - - - 航向锁定 - - - - - - 130 - 130 - 100 - 30 - - - - - - - 关伺服 - - - - - - 10 - 50 - 100 - 30 - - - - - - - 收藏模式 - - - - - - 10 - 90 - 100 - 30 - - - - - - - 航向随动 - - - - - - 10 - 10 - 100 - 30 - - - - - - - 垂直下视 - - - - - - 740 - 10 - 261 - 121 - - - - 指引 - - - - - 60 - 80 - 71 - 21 - - - - - - - 60 - 40 - 71 - 21 - - - - - - - 10 - 40 - 41 - 16 - - - - 方位: - - - - - - 10 - 80 - 41 - 16 - - - - 俯仰: - - - - - - 150 - 39 - 101 - 21 - - - - - - - 姿态指引 - - - - - - 150 - 79 - 101 - 21 - - - - - - - 数字引导 - - - - - - - 460 - 10 - 261 - 121 - - - - 扫描设置 - - - - - 150 - 79 - 100 - 21 - - - - - - - 云台扫描 - - - - - - 150 - 39 - 100 - 21 - - - - - - - 设置 - - - - - - 60 - 40 - 71 - 21 - - - - - - - 60 - 80 - 71 - 21 - - - - - - - 12 - 40 - 41 - 21 - - - - 角度: - - - - - - 12 - 80 - 41 - 21 - - - - 速度: - - + + + + 174 + 150 + 161 + 106 + + + + + + + + 0 + 30 + + + + + + + 垂直下视 + + + + + + + + 0 + 30 + + + + + + + 航向锁定 + + + + + + + + 0 + 30 + + + + + + + 航向随动 + + + + + + + + 0 + 30 + + + + + + + 镜头收藏 + + + + + + + + 0 + 30 + + + + + + + 关伺服 + + + + - + - 140 - 90 - 61 + 9 + 9 + 144 21 @@ -1865,16 +198,105 @@ font: 12pt "Microsoft YaHei UI"; font: 12pt "Microsoft YaHei UI"; - 陀螺 + 伺服控制步长选择: + + + + + + 174 + 9 + 72 + 24 + + + + + + + 9 + 250 + 324 + 71 + + + 视频 + + + + + + + 0 + 30 + + + + + + + 图像切换 + + + + + + + + 0 + 30 + + + + + + + 停止录像 + + + + + + + + 0 + 30 + + + + + + + 开始录像 + + + + + + + + 0 + 30 + + + + + + + 抓图 + + + + - 140 - 50 - 61 - 21 + 9 + 39 + 57 + 27 @@ -1885,96 +307,1845 @@ font: 12pt "Microsoft YaHei UI"; 框架 - - - - AI检测 - - + - 10 - 10 - 121 - 30 + 92 + 39 + 57 + 27 - + color: rgb(255, 255, 255); +font: 12pt "Microsoft YaHei UI"; - AI开 + 陀螺 - + - 10 - 130 - 121 - 30 + 260 + 430 + 71 + 91 - - + + 透雾模式 - - AI检测框隐藏 + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - 10 - 50 - 121 - 30 + + + + + + 0 + 25 + + + + + + + + + 0 + 30 + + + + + + + 设置 + + + + + + + + + 9 + 540 + 324 + 141 - - - - - AI关 + + 红外 + + + + + + + 0 + 30 + + + + + + + 调焦- + + + + + + + + 0 + 30 + + + + + + + 对比度- + + + + + + + + 0 + 30 + + + + + + + 亮度- + + + + + + + + 0 + 30 + + + + + + + 对比度+ + + + + + + + + 0 + 30 + + + + + + + 变倍- + + + + + + + + 0 + 30 + + + + + + + 亮度+ + + + + + + + + 0 + 30 + + + + + + + 变倍+ + + + + + + + + 0 + 30 + + + + + + + 调焦+ + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + + + + 伪色彩切换 + + + + + + + + + 9 + 690 + 321 + 71 + + + 激光测距 + + + + + + + 0 + 30 + + + + + + + 单次测距 + + + + + + + + 0 + 30 + + + + + + + 开启连续测距 + + + + + + + + 0 + 30 + + + + + + + 停止连续测距 + + + + - + - 10 - 90 - 121 - 30 + 174 + 30 + 161 + 111 - - + + 指引 - - AI检测框显示 + + + + + + 0 + 30 + + + + + + + 姿态指引 + + + + + + + + 0 + 30 + + + + + + + 数字引导 + + + + + + + + + 方位: + + + + + + + + 0 + 30 + + + + + + + + + + + + + 0 + 30 + + + + 俯仰: + + + + + + + + 0 + 30 + + + + + + + + + + + + 9 + 430 + 251 + 111 + + + + + + + + 0 + 30 + + + + + + + 低照度模式 + + + + + + + + 0 + 30 + + + + + + + 取消跟踪 + + + + + + + + 0 + 30 + + + + + + + 电子稳像关 + + + + + + + + 0 + 30 + + + + + + + 选点跟踪 + + + + + + + + 0 + 30 + + + + + + + 电子稳像开 + + + + + + + + 0 + 30 + + + + 速度: + + + 7 + + + + + + + + + 9 + 320 + 324 + 111 + + + 可见光 + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 对比度- + + + + + + + + 0 + 30 + + + + + + + 变倍- + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 焦距+ + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 焦距- + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 对比度+ + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 亮度- + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 亮度+ + + + + + + + + 0 + 30 + + + + + + + 变倍+ + + + + + + + + + -10 + 60 + 180 + 180 + + + + + 180 + 180 + + + + + 180 + 180 + + + + + + + + 55 + 55 + + + + + 55 + 55 + + + + + + + + + + + + + + + 55 + 55 + + + + + 55 + 55 + + + + + + + + + + + + + + + 55 + 55 + + + + + 55 + 55 + + + + + + + + + + + + + + + 0 + 0 + + + + + 55 + 55 + + + + + 55 + 55 + + + + + + + + + + + + + + + 0 + 0 + + + + + 55 + 55 + + + + + 55 + 55 + + + + + + + + + + + - + + + + 扩展控制 + + - 380 - 10 - 241 - 151 + 20 + 150 + 321 + 211 - 目标检测方式设置 + 可见光 + + + + + + + 0 + 30 + + + + + + + 增益- + + + + + + + + 0 + 30 + + + + + + + 增益+ + + + + + + + + 0 + 30 + + + + + + + 恢复出场设置 + + + + + + + + 0 + 30 + + + + + + + 可见光镜头初始化 + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 自动亮度 + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + 自动对比度 + + + + + + + + 0 + 30 + + + + + + + 恢复默认 + + + + + + + + 0 + 30 + + + + + + + 自动ICR开 + + + + + + + + 0 + 30 + + + + + + + 自动增益 + + + + + + + + 0 + 30 + + + + + + + 自动ICR关 + + + + + + + + + 20 + 360 + 321 + 211 + - - - - 80 - 120 - 100 - 21 - + + 红外 + + + + + + + 0 + 30 + + + + + + + 场景补偿 + + + + + + + + 0 + 30 + + + + + + + 恢复默认设置 + + + + + + + + 0 + 30 + + + + + + + 恢复出厂设置 + + + + + + + + 0 + 30 + + + + + + + 观测模式 + + + + + + + + 0 + 30 + + + + + + + 红外快门补偿 + + + + + + + + 0 + 30 + + + + + + + 电子放大 + + + + + + + + 0 + 30 + + + + + + + 测温模式 + + + + + + + + 0 + 30 + + + + + + + 自动对焦 + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + + + + 红外图像增强 + + + + + + + + + 10 + 0 + 341 + 153 + + + + + + + 字符叠加设置 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + 0 + 20 + + + + OSD类型选择: + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + + + + 设置 + + + + + + + + + + 视频显示模式设置 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + 0 + 20 + + + + 显示模式选择: + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + + + + 设置 + + + + + + + + + + + + 10 + 580 + 341 + 152 + + + + + + + 红外报警设置 + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + 温度阈值 + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + 设置 + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + 检测开关 + + + + + + + + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + + + + + 目标跟踪模板大小设置 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + 0 + 30 + + + + 类型选择: + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + 目标模板宽: + + + + + + + + 0 + 30 + + + + + + + + + 0 + 30 + + + + 目标模板高: + + + + + + + + 0 + 30 + + + + + + + + + 0 + 20 + + + + + 16777215 + 30 + + + + + + + 设置 + + + + + + + + + + + + 10 + 730 + 341 + 47 + + + + + + + + 0 + 30 + + + + + + + 停止连续抓图 + + + + + + + + 0 + 30 + + + + + + + 开始连续抓图 + + + + + + + + 0 + 30 + + + + + + + 吊舱时间更新 + + + + + + + + + AI检测 + + + + + 10 + 0 + 321 + 174 + + + + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + AI开 + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + AI关 + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + AI检测框显示 + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + AI检测框隐藏 + + + + + + + + + + AI跟踪 + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + 目标类型: + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + 编号选择: + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + AI跟踪 + + + + + + + + + + + + + + 520 + 20 + 101 + 81 + + + + IP设置 + + + Qt::AlignmentFlag::AlignCenter + + + + + + 光电吊舱IP: + + + + + + + + + + + + + + + + @@ -1982,74 +2153,226 @@ font: 12pt "Microsoft YaHei UI"; 设置 - - - - 140 - 40 - 91 - 21 - + + + + + + + 540 + 100 + 71 + 61 + + + + 焦距设置 + + + + + + + 0 + 0 + - - - - 140 - 80 - 91 - 21 - + + + + + + 0 + 0 + + + + + + + 设置 + + + + + + + 520 + 270 + 131 + 51 + + + + 扫描设置 + + + + + 150 + 79 + 100 + 21 + + + + + + + 云台扫描 + + + + + + 150 + 39 + 100 + 21 + + + + + + + 设置 + + + + + + 60 + 40 + 71 + 21 + + + + + + + 60 + 80 + 71 + 21 + + + + + + + 12 + 40 + 41 + 21 + + + + 角度: + + + + + + 12 + 80 + 41 + 21 + + + + 速度: + + + + + + + 530 + 180 + 91 + 71 + + + + 目标检测方式设置 + + + - - - 10 - 40 - 121 - 20 - + + + 0 + 30 + + + + + 16777215 + 30 + 传感器类型选择: + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + - - - 10 - 80 - 121 - 20 - + + + 0 + 30 + + + + + 16777215 + 30 + 检测方式: - - - - - 640 - 10 - 221 - 151 - - - - 检测兴趣区域位置设置 - - - - - 110 - 120 - 91 - 21 - + + + + + + 0 + 30 + + + + 16777215 + 30 + + + + + + @@ -2057,60 +2380,105 @@ font: 12pt "Microsoft YaHei UI"; 设置 + + + + + + + 500 + 370 + 181 + 101 + + + + 检测兴趣区域位置设置 + + + - - - 10 - 40 - 81 - 20 - + + + 0 + 30 + + + + + 16777215 + 30 + 方位像素: + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + - - - 10 - 80 - 81 - 20 - + + + 0 + 30 + + + + + 16777215 + 30 + 俯仰像素: - - - - 100 - 40 - 81 - 23 - - - + + - - - 100 - 80 - 81 - 23 - + + + 0 + 30 + + + + + 16777215 + 30 + + + - - - 10 - 120 - 91 - 21 - + + + 0 + 30 + + + + + 16777215 + 30 + @@ -2122,86 +2490,30 @@ font: 12pt "Microsoft YaHei UI"; false - - - - - 150 - 10 - 211 - 151 - - - - AI跟踪 - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - 60 - 120 - 100 - 21 - + + + + + + 0 + 30 + + + + + 16777215 + 30 + - AI跟踪 - - - - - - 100 - 40 - 101 - 21 - - - - - - - 12 - 40 - 81 - 21 - - - - 目标类型: - - - - - - 10 - 80 - 81 - 21 - - - - 编号选择: - - - - - - 100 - 80 - 101 - 21 - + 设置 - - + + diff --git a/Src/GDDC/gddcStateInfo.cpp b/Src/GDDC/gddcStateInfo.cpp index b5a012f..a237412 100644 --- a/Src/GDDC/gddcStateInfo.cpp +++ b/Src/GDDC/gddcStateInfo.cpp @@ -584,9 +584,9 @@ void GDDCStateInfo::UDPMessageReceive(QByteArray &da, int size) { } bool GDDCStateInfo::checkdata(QByteArray buffer, int length, int type) { - if (length != 64) { - return false; - } + // if (length != 64) { + // return false; + // } if ((buffer.at(0) != '\xFC') || (buffer.at(1) != '\x2C') || buffer.at(63) != '\xF0') { return false; diff --git a/Src/GDDC/gddcdlg.cpp b/Src/GDDC/gddcdlg.cpp index d7f332f..58cb8eb 100644 --- a/Src/GDDC/gddcdlg.cpp +++ b/Src/GDDC/gddcdlg.cpp @@ -9,182 +9,232 @@ #include #include #include - +#include #include "ui_gddcdlg.h" #pragma comment(lib, "Wtsapi32.lib") using namespace std; DWORD GetmPid(LPCWSTR ProcessName) { - PWTS_PROCESS_INFOW wts; - DWORD Count; - DWORD i = 0; - - BOOL result = - WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &wts, &Count); - if (result == 0) { - cout << "WTSEnumerateProcessesW Error" << endl; - - return 1; - } - cout << "WTSEnumerateProcessesW Success" << endl; - for (i; i < Count; i++) { - if (lstrcmpiW(wts[i].pProcessName, ProcessName) == 0) { - DWORD pid = wts[i].ProcessId; - cout << "find pid:" << pid << endl; - - return pid; - break; - } + PWTS_PROCESS_INFOW wts; + DWORD Count; + DWORD i = 0; + + BOOL result = + WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &wts, &Count); + if (result == 0) { + cout << "WTSEnumerateProcessesW Error" << endl; + + return 1; + } + cout << "WTSEnumerateProcessesW Success" << endl; + for (i; i < Count; i++) { + if (lstrcmpiW(wts[i].pProcessName, ProcessName) == 0) { + DWORD pid = wts[i].ProcessId; + cout << "find pid:" << pid << endl; + + return pid; + break; } + } - WTSFreeMemory(wts); + WTSFreeMemory(wts); } #define CONFIG_PATH "config.ini" -#define CMDPAGEHIGHT 210 +#define CMDPAGEWIDTH 380 #define STATEPAGEWIDTH 250 GDDCdlg::GDDCdlg(QWidget *parent) : QWidget(parent), ui(new Ui::GDDCdlg) { - ui->setupUi(this); + ui->setupUi(this); - initWindow(); - initParam(); - initSignalSlot(); + initWindow(); + initParam(); + initSignalSlot(); } GDDCdlg::~GDDCdlg() { - // 停止所有通信 - stopPushURL(); - stopConnectURL1(); - stopConnectURL2(); - stopConnectSerialCtrl(); - stopConnectUDPCtrl(); - stopConnectTCPCtrl(); - - delete m_DlgGDDCSet; - delete m_GDDCCmdDlg; - delete m_GDDCStateDlg; - delete ui; + // 停止所有通信 + stopPushURL(); + stopConnectURL1(); + stopConnectURL2(); + stopConnectSerialCtrl(); + stopConnectUDPCtrl(); + stopConnectTCPCtrl(); + + delete m_DlgGDDCSet; + delete m_GDDCCmdDlg; + delete m_GDDCStateDlg; + delete ui; } // 初始化window void GDDCdlg::initWindow() { - QPalette palette; - // 设置主窗口背景颜色 - palette.setColor(QPalette::Window, QColor(50, 50, 50)); - this->setPalette(palette); - // 嵌入到主窗口 - setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); - hide(); - - m_DlgGDDCSet = new GDDCSet(this); - m_DlgGDDCSet->setWindowFlags(Qt::Dialog); - m_DlgGDDCSet->setWindowModality(Qt::WindowModal); // 设置为模态对话框 - m_GDDCCmdDlg = new GDDCCmdDlg(this); - m_GDDCStateDlg = new GDDCStateInfo(this); - ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png")); - ui->pushButShowCmdPage->setIcon(QIcon(":/res/down.png")); - - // connect( - // ui->WgtffmpegVideo, &VideoWidget::sendErrorMessageSignal, this, - // [&](QString message, int type) { - // qDebug() << "GDDC receive message:" << message; - // g_notifyManager->notify(message, "", type); - // }, - // Qt::UniqueConnection); - connect(ui->WgtffmpegVideo, &VideoWidget::sendErrorMessageSignal, this, - &GDDCdlg::showErrorMessage, Qt::UniqueConnection); - ui->WgtffmpegVideo->setVedioSaveFileDirPath("./Video"); + QPalette palette; + // 设置主窗口背景颜色 + palette.setColor(QPalette::Window, QColor(50, 50, 50)); + this->setPalette(palette); + // 嵌入到主窗口 + setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); + hide(); + + m_DlgGDDCSet = new GDDCSet(this); + m_DlgGDDCSet->setWindowFlags(Qt::Dialog); + m_DlgGDDCSet->setWindowModality(Qt::WindowModal); // 设置为模态对话框 + m_GDDCCmdDlg = new GDDCCmdDlg(this); + m_GDDCStateDlg = new GDDCStateInfo(this); + ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png")); + ui->pushButShowCmdPage->setIcon(QIcon(":/res/right.png")); + + // connect( + // ui->WgtffmpegVideo, &VideoWidget::sendErrorMessageSignal, this, + // [&](QString message, int type) { + // qDebug() << "GDDC receive message:" << message; + // g_notifyManager->notify(message, "", type); + // }, + // Qt::UniqueConnection); + connect(ui->WgtffmpegVideo, &VideoWidget::sendErrorMessageSignal, this, + &GDDCdlg::showErrorMessage, Qt::UniqueConnection); + ui->WgtffmpegVideo->setVedioSaveFileDirPath("./Video"); } // 初始化参数 void GDDCdlg::initParam() { - pointSelectionTracking = false; - Is_openVideo = false; - isCmdPageShow = true; - isStatePageShow = true; - detectionAreaSetting = false; - connectFlag.resize(12, false); + pointSelectionTracking = false; + Is_openVideo = false; + isCmdPageShow = true; + isStatePageShow = false; + detectionAreaSetting = false; + connectFlag.resize(12, false); + + _delta = 0; + + _wheelStopTime = new QTimer(this); + _wheelStopTime->setInterval(300); + _wheelStopTime->setSingleShot(true); + _dragFlag = false; + _moveFlag = false; + + firstLocation = new QLabel(this); + firstLocation->setPixmap(QPixmap(":/img/Pod/c.png")); + firstLocation->setScaledContents(true); + firstLocation->resize(30,30); + firstLocation->setStyleSheet("border: none; background: transparent;"); + firstLocation->hide(); + + lastLocation = new QLabel(this); + lastLocation->setPixmap(QPixmap(":/img/Pod/circle.png")); + lastLocation->setScaledContents(true); + lastLocation->resize(25,25); + lastLocation->setStyleSheet("border: none; background: transparent;"); + lastLocation->hide(); + + wheelPlus = new QLabel(this); + wheelPlus->setPixmap(QPixmap(":/img/Pod/plus.png")); + wheelPlus->setScaledContents(true); + wheelPlus->resize(30,30); + wheelPlus->setStyleSheet("border: none; background: transparent;"); + wheelPlus->hide(); + + wheelSub = new QLabel(this); + wheelSub->setPixmap(QPixmap(":/img/Pod/sub.png")); + wheelSub->setScaledContents(true); + wheelSub->resize(30,30); + wheelSub->setStyleSheet("border: none; background: transparent;"); + wheelSub->hide(); } // 初始化信号与槽 void GDDCdlg::initSignalSlot() { - /*******有四种方式*******/ - // 方式一 - connect(ui->pushButtonSet, SIGNAL(clicked()), this, - SLOT(pushButtonSet_clicked())); - // 方式二 - // connect(ui->pushButtonSet,&QPushButton::clicked,this,&::GDDCdlg::pushButtonSet_clicked); - // 方式三 - // connect(ui->pushButtonSet, - // QOverload::of(&QPushButton::clicked),this,&::GDDCdlg::pushButtonSet_clicked); - // 方式四 - // connect(ui->pushButtonSet,&QPushButton::clicked,[=](bool - // check){pushButtonSet_clicked();}); - connect(ui->pushButShowCmdPage, SIGNAL(clicked()), this, - SLOT(pushButShowCmdPage_clicked())); // 控制页面隐藏显示按钮 - connect(ui->pushButShowStatePage, SIGNAL(clicked()), this, - SLOT(pushButShowStatePage_clicked())); // 状态页面隐藏显示按钮 - connect(m_DlgGDDCSet, SIGNAL(SignalStartConnect(int)), this, - SLOT(startConnect(int))); // 开始连接 - connect(m_DlgGDDCSet, SIGNAL(SignalStopConnect(int)), this, - SLOT(stopConnect(int))); // 停止连接 + /*******有四种方式*******/ + // 方式一 + connect(ui->pushButtonSet, SIGNAL(clicked()), this, + SLOT(pushButtonSet_clicked())); + // 方式二 + // connect(ui->pushButtonSet,&QPushButton::clicked,this,&::GDDCdlg::pushButtonSet_clicked); + // 方式三 + // connect(ui->pushButtonSet, + // QOverload::of(&QPushButton::clicked),this,&::GDDCdlg::pushButtonSet_clicked); + // 方式四 + // connect(ui->pushButtonSet,&QPushButton::clicked,[=](bool + // check){pushButtonSet_clicked();}); + connect(ui->pushButShowCmdPage, SIGNAL(clicked()), this, + SLOT(pushButShowCmdPage_clicked())); // 控制页面隐藏显示按钮 + connect(ui->pushButShowStatePage, SIGNAL(clicked()), this, + SLOT(pushButShowStatePage_clicked())); // 状态页面隐藏显示按钮 + connect(m_DlgGDDCSet, SIGNAL(SignalStartConnect(int)), this, + SLOT(startConnect(int))); // 开始连接 + connect(m_DlgGDDCSet, SIGNAL(SignalStopConnect(int)), this, + SLOT(stopConnect(int))); // 停止连接 + + connect(this, &GDDCdlg::wheelSendData, m_GDDCCmdDlg, &GDDCCmdDlg::wheelSwipe); + connect(_wheelStopTime, &QTimer::timeout, this, [this](){ + emit wheelSendData(0); + qDebug()<<"滚轮停止了"; + // if(wheelPlus->isVisible()) + // { + // wheelPlus->hide(); + // } + // else if(wheelSub->isVisible()) + // { + // wheelSub->hide(); + // } + }); } // 槽函数开始连接 void GDDCdlg::startConnect(int type) { - switch (type) { - case 1: // 播放视频1 - stopConnectURL2(); - startConnectURL1(); - break; - case 2: // 播放视频2 - stopConnectURL1(); - startConnectURL2(); - break; - case 3: // 串口控制 - startConnectSerialCtrl(); - break; - case 4: // UDP控制 - stopConnectTCPCtrl(); - startConnectUDPCtrl(); - break; - case 5: // TCP控制 - stopConnectUDPCtrl(); - startConnectTCPCtrl(); - break; - case 6: // 视频(1)推流 - startPushURL(); - break; - default: - break; - } + switch (type) { + case 1: // 播放视频1 + stopConnectURL2(); + startConnectURL1(); + break; + case 2: // 播放视频2 + stopConnectURL1(); + startConnectURL2(); + break; + case 3: // 串口控制 + startConnectSerialCtrl(); + break; + case 4: // UDP控制 + stopConnectTCPCtrl(); + startConnectUDPCtrl(); + break; + case 5: // TCP控制 + stopConnectUDPCtrl(); + startConnectTCPCtrl(); + break; + case 6: // 视频(1)推流 + startPushURL(); + break; + default: + break; + } } // 槽函数停止连接 void GDDCdlg::stopConnect(int type) { - switch (type) { - case 1: - stopConnectURL1(); - break; - case 2: - stopConnectURL2(); - break; - case 3: - stopConnectSerialCtrl(); - break; - case 4: - stopConnectUDPCtrl(); - break; - case 5: - stopConnectTCPCtrl(); - break; - case 6: - stopPushURL(); - break; - default: - break; - } + switch (type) { + case 1: + stopConnectURL1(); + break; + case 2: + stopConnectURL2(); + break; + case 3: + stopConnectSerialCtrl(); + break; + case 4: + stopConnectUDPCtrl(); + break; + case 5: + stopConnectTCPCtrl(); + break; + case 6: + stopPushURL(); + break; + default: + break; + } } // bool GDDCdlg::eventFilter(QObject *watched, QEvent *event) // { @@ -202,447 +252,533 @@ void GDDCdlg::stopConnect(int type) { // } // 鼠标左键 void GDDCdlg::mousePressEvent(QMouseEvent *event) { - // 如果鼠标左键按下 - if (event->type() == QEvent::MouseButtonPress) { - // AI检测区域设置 - if (m_GDDCCmdDlg->detectionAreaSetting == true) { - QPointF sPoint1 = event->globalPosition(); - sPoint1 = QCursor::pos(); - QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1); - double a = ui->WgtffmpegVideo->width(); - double b = ui->WgtffmpegVideo->height(); - double dir = 1920 / a * widgetPoint.rx() - 960; - double pitch = -(1080 / b * widgetPoint.ry() - 540); - m_GDDCCmdDlg->setAIDetcLineEditText(QString::number((int)dir), - QString::number((int)pitch)); - } - // 目标跟踪 - if (m_GDDCCmdDlg->pointSelectionTracking == true) { - QPointF sPoint1 = event->globalPosition(); - QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1); - double a = ui->WgtffmpegVideo->width(); - double b = ui->WgtffmpegVideo->height(); - double dir = 1920 / a * widgetPoint.rx() - 960; - double pitch = -(1080 / b * widgetPoint.ry() - 540); + // 如果鼠标左键按下 + /*if (event->type() == QEvent::MouseButtonPress) { + // AI检测区域设置 + if (m_GDDCCmdDlg->detectionAreaSetting == true) { + QPointF sPoint1 = event->globalPosition(); + sPoint1 = QCursor::pos(); + QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1); + double a = ui->WgtffmpegVideo->width(); + double b = ui->WgtffmpegVideo->height(); + double dir = 1920 / a * widgetPoint.rx() - 960; + double pitch = -(1080 / b * widgetPoint.ry() - 540); + m_GDDCCmdDlg->setAIDetcLineEditText(QString::number((int)dir), + QString::number((int)pitch)); + } + + }*/ + if(ui->WgtffmpegVideo->underMouse()) + { + if(event->button() == Qt::LeftButton) + { + //记录鼠标按下位置 + _dragStartPositon = event->pos(); + //QPointF b = event->globalPosition(); + qDebug() << "局部坐标" << "x" << _dragStartPositon.x() << "y" << _dragStartPositon.y(); + //qDebug() << "全局坐标" << "x" << b.x() << "y" << b.y(); + _dragFlag = true; + } + } +} +// 鼠标移动 +void GDDCdlg::mouseMoveEvent(QMouseEvent *event) { + /*if (m_GDDCCmdDlg->detectionAreaSetting == true) { + // qDebug() << this->geometry().x(); + // qDebug() << this->geometry().y(); + QPointF sPoint1 = event->globalPosition(); + // qDebug()<<"相对于屏幕坐标1:"<<"("<mapFromGlobal(sPoint2); + // qDebug()<<"相对于窗口坐标:"<<"("<WgtffmpegVideo->mapFromGlobal(sPoint1); + // qDebug()<<"相对于控件坐标:"<<"("<WgtffmpegVideo->width(); + double b = ui->WgtffmpegVideo->height(); + double dir = 1920 / a * widgetPoint.rx() - 960; + double pitch = -(1080 / b * widgetPoint.ry() - 540); + m_GDDCCmdDlg->setAIDetcLineEditText(QString::number((int)dir), + QString::number((int)pitch)); + }*/ + if(_dragFlag)//点击并且移动 + { + QPointF diff = event->pos() - _dragStartPositon; + qDebug() << "x:" << diff.x() <<"y:" <setMoveParm(diff); + _moveFlag = true; + firstLocation->move((_dragStartPositon - QPoint(firstLocation->width()/2, firstLocation->height()/2)).toPoint()); + lastLocation->move(event->pos() - QPoint(lastLocation->width() / 2, lastLocation->height() / 2)); + firstLocation->show(); + lastLocation->show(); + } +} + +void GDDCdlg::mouseReleaseEvent(QMouseEvent *event) +{ + if(ui->WgtffmpegVideo->underMouse()) + { + if(event->button() == Qt::LeftButton && _moveFlag) + { + _moveFlag = false; std::byte buffer[10]; - buffer[0] = (std::byte)0x3A; - buffer[1] = (std::byte)(dir); - buffer[2] = (std::byte)((int)dir >> 8); - buffer[3] = (std::byte)pitch; - buffer[4] = (std::byte)((int)pitch >> 8); - buffer[5] = (std::byte)0x00; + buffer[5] = (std::byte)0x70; buffer[6] = (std::byte)0x00; buffer[7] = (std::byte)0x00; buffer[8] = (std::byte)0x00; buffer[9] = (std::byte)0x00; - // 发送5次 + // 发送3次 m_GDDCCmdDlg->sendCurDate(buffer, 3); + firstLocation->hide(); + lastLocation->hide(); + } + else if(event->button() == Qt::LeftButton && _dragFlag) + { + // 目标跟踪 + if (m_GDDCCmdDlg->pointSelectionTracking == true) { + QPointF sPoint1 = event->globalPosition(); + QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1); + double a = ui->WgtffmpegVideo->width(); + double b = ui->WgtffmpegVideo->height(); + double dir = 1920 / a * widgetPoint.rx() - 960; + double pitch = -(1080 / b * widgetPoint.ry() - 540); + std::byte buffer[10]; + buffer[0] = (std::byte)0x3A; + buffer[1] = (std::byte)(dir); + buffer[2] = (std::byte)((int)dir >> 8); + buffer[3] = (std::byte)pitch; + buffer[4] = (std::byte)((int)pitch >> 8); + buffer[5] = (std::byte)0x00; + buffer[6] = (std::byte)0x00; + buffer[7] = (std::byte)0x00; + buffer[8] = (std::byte)0x00; + buffer[9] = (std::byte)0x00; + + // 发送5次 + m_GDDCCmdDlg->sendCurDate(buffer, 3); + } } - } -} -// 鼠标移动 -void GDDCdlg::mouseMoveEvent(QMouseEvent *event) { - if (m_GDDCCmdDlg->detectionAreaSetting == true) { - // qDebug() << this->geometry().x(); - // qDebug() << this->geometry().y(); - QPointF sPoint1 = event->globalPosition(); - // qDebug()<<"相对于屏幕坐标1:"<<"("<mapFromGlobal(sPoint2); - // qDebug()<<"相对于窗口坐标:"<<"("<WgtffmpegVideo->mapFromGlobal(sPoint1); - // qDebug()<<"相对于控件坐标:"<<"("<WgtffmpegVideo->width(); - double b = ui->WgtffmpegVideo->height(); - double dir = 1920 / a * widgetPoint.rx() - 960; - double pitch = -(1080 / b * widgetPoint.ry() - 540); - m_GDDCCmdDlg->setAIDetcLineEditText(QString::number((int)dir), - QString::number((int)pitch)); } } // 区域重绘 void GDDCdlg::resizeEvent(QResizeEvent *event) { - resizeUI(); // 重新设置布局 + resizeUI(); // 重新设置布局 } // 重新设置布局 void GDDCdlg::resizeUI() { - /* -------------->x - * | (0,0) - * | - * | - * | - * | - * ↓ y - */ - double GDDCPageHeight = (double)(this->height()); - double GDDCPageWidth = (double)(this->width()); - // qDebug()<<"宽度,高度:"<setGeometry(0, GDDCPageHeight - cmdAreaHeight, - (int)cmdAreaWidth, (int)cmdAreaHeight); - m_GDDCCmdDlg->setTabWidgetGeometry(0, 0, cmdAreaWidth, cmdAreaHeight); - - /*********状态区位置和大小设置***********/ - double stateAreaHeight = GDDCPageHeight; - double stateAreaWidth; - if (isStatePageShow) { - stateAreaWidth = STATEPAGEWIDTH; - } else { - stateAreaWidth = 0; - } - m_GDDCStateDlg->setGeometry(GDDCPageWidth - stateAreaWidth, 0, - stateAreaWidth, stateAreaHeight); - m_GDDCStateDlg->setTableViewGeometry(0, 0, stateAreaWidth, stateAreaHeight); - - /*******视频区位置和大小设置********/ - double VideoAreaHeight = GDDCPageHeight - cmdAreaHeight; // 视频区高度 - double VideoAreaWidth = GDDCPageWidth - stateAreaWidth; // 视频区宽度 - // //高度值相对比较大 - // if(VideoAreaHeight*16>VideoAreaWidth*9) - // { - // double setVideoAreaWidth = - // VideoAreaWidth;//等于吊舱页面宽度-状态区高度 double - // setVideoAreaHeight = VideoAreaWidth*9/16; - // ui->WgtffmpegVideo->setGeometry(0,0.5*(VideoAreaHeight-setVideoAreaHeight),(int)setVideoAreaWidth,(int)setVideoAreaHeight); - // } - // //宽度值相对比较大 - // else - // { - // double setVideoAreaHeight = - // VideoAreaHeight;//等于吊舱页面高度-控制区高度 double - // setVideoAreaWidth = VideoAreaHeight*16/9; - // ui->WgtffmpegVideo->setGeometry(0.5*(VideoAreaWidth-setVideoAreaWidth),0,(int)setVideoAreaWidth,(int)setVideoAreaHeight); - // } - ui->WgtffmpegVideo->setGeometry(0, 0, (int)VideoAreaWidth, - (int)VideoAreaHeight); - - /**************设置按钮****************/ - ui->pushButtonSet->setGeometry(GDDCPageWidth - stateAreaWidth, 0, 30, 30); - ui->pushButtonSet->raise(); - - /**********控制页显示隐藏按钮********/ - ui->pushButShowCmdPage->setGeometry( - cmdAreaWidth * 0.5, GDDCPageHeight - cmdAreaHeight - 15, 50, 15); - ui->pushButShowCmdPage->raise(); - - /**********状态页显示隐藏按钮********/ - ui->pushButShowStatePage->setGeometry( - GDDCPageWidth - stateAreaWidth - 15, - (stateAreaHeight - cmdAreaHeight) * 0.5, 15, 50); - ui->pushButShowStatePage->raise(); + /* -------------->x + * | (0,0) + * | + * | + * | + * | + * ↓ y + */ + double GDDCPageHeight = (double)(this->height()); + double GDDCPageWidth = (double)(this->width()); + // qDebug()<<"宽度,高度:"<setGeometry(GDDCPageWidth - cmdAreaWidth, 0, (int)cmdAreaWidth, + GDDCPageHeight); + m_GDDCCmdDlg->setTabWidgetGeometry(0, 0, cmdAreaWidth, cmdAreaHeight); + + /*********状态区位置和大小设置***********/ + double stateAreaHeight = 0; + double stateAreaWidth = 0; + if (isStatePageShow) { + stateAreaWidth = STATEPAGEWIDTH; + stateAreaHeight = GDDCPageHeight; + } + m_GDDCStateDlg->setGeometry(0, 0, stateAreaWidth, stateAreaHeight); + m_GDDCStateDlg->setTableViewGeometry(0, 0, stateAreaWidth, stateAreaHeight); + + /*******视频区位置和大小设置********/ + double VideoAreaHeight = GDDCPageHeight /*- cmdAreaHeight*/; // 视频区高度 + double VideoAreaWidth = GDDCPageWidth - cmdAreaWidth; // 视频区宽度 + // //高度值相对比较大 + // if(VideoAreaHeight*16>VideoAreaWidth*9) + // { + // double setVideoAreaWidth = + // VideoAreaWidth;//等于吊舱页面宽度-状态区高度 double + // setVideoAreaHeight = VideoAreaWidth*9/16; + // ui->WgtffmpegVideo->setGeometry(0,0.5*(VideoAreaHeight-setVideoAreaHeight),(int)setVideoAreaWidth,(int)setVideoAreaHeight); + // } + // //宽度值相对比较大 + // else + // { + // double setVideoAreaHeight = + // VideoAreaHeight;//等于吊舱页面高度-控制区高度 double + // setVideoAreaWidth = VideoAreaHeight*16/9; + // ui->WgtffmpegVideo->setGeometry(0.5*(VideoAreaWidth-setVideoAreaWidth),0,(int)setVideoAreaWidth,(int)setVideoAreaHeight); + // } + ui->WgtffmpegVideo->setGeometry(0, 0, (int)VideoAreaWidth, + (int)VideoAreaHeight); + + /**************设置按钮****************/ + ui->pushButtonSet->setGeometry(GDDCPageWidth - cmdAreaWidth - 30, 0, 30, 30); + ui->pushButtonSet->raise(); + + /**********控制页显示隐藏按钮********/ + ui->pushButShowCmdPage->setGeometry(GDDCPageWidth - cmdAreaWidth - 15, + GDDCPageHeight * 0.5, 15, 50); + ui->pushButShowCmdPage->raise(); + + /**********状态页显示隐藏按钮********/ + ui->pushButShowStatePage->setGeometry(0 + stateAreaWidth, + GDDCPageHeight * 0.5, 15, 50); + ui->pushButShowStatePage->raise(); } void GDDCdlg::setGlobalSetMap( std::unordered_map &gSetMap) { - if (m_DlgGDDCSet) { - m_DlgGDDCSet->initPullURL(gSetMap["光电吊舱"].net.remoteIp); - } + if (m_DlgGDDCSet) { + m_DlgGDDCSet->initPullURL(gSetMap["光电吊舱"].net.remoteIp); + } } // 定时器处理 void GDDCdlg::GDDCControlTimeOut() { - if (m_GDDCCmdDlg->sendTimes > 0) { // 优先发送次数指令 - m_GDDCCmdDlg->sendTimes -= 1; - - // UDP控制 - if (connectFlag[3]) { - udpSocket->writeDatagram( - m_GDDCCmdDlg->m_DCcmdBuffer, - m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(), - m_DlgGDDCSet->m_myPairNetwork.getRemotePort()); - } - // TCP控制 - - // 串口控制 + if (m_GDDCCmdDlg->sendTimes > 0) { // 优先发送次数指令 + m_GDDCCmdDlg->sendTimes -= 1; - if (m_GDDCCmdDlg->sendTimes == 0) { - m_GDDCCmdDlg->clearTJDCCmdBuffer(); - } - } else { // 发送常发帧或长按指令 - m_GDDCCmdDlg->UpdateDataTJDC(); - // UDP控制 - if (connectFlag[3]) { - udpSocket->writeDatagram( - m_GDDCCmdDlg->m_DCcmdBuffer, - m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(), - m_DlgGDDCSet->m_myPairNetwork.getRemotePort()); - } + // UDP控制 + if (connectFlag[3]) { + udpSocket->writeDatagram(m_GDDCCmdDlg->m_DCcmdBuffer, + m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(), + m_DlgGDDCSet->m_myPairNetwork.getRemotePort()); + } + // TCP控制 - // TCP控制 + // 串口控制 - // 串口控制 + if (m_GDDCCmdDlg->sendTimes == 0) { + m_GDDCCmdDlg->clearTJDCCmdBuffer(); + } + } else { // 发送常发帧或长按指令 + m_GDDCCmdDlg->UpdateDataTJDC(); + // UDP控制 + if (connectFlag[3]) { + udpSocket->writeDatagram(m_GDDCCmdDlg->m_DCcmdBuffer, + m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(), + m_DlgGDDCSet->m_myPairNetwork.getRemotePort()); } + + // TCP控制 + + // 串口控制 + } } // 播放视频1 void GDDCdlg::startConnectURL1() { - if (!connectFlag[0]) { - connectFlag[0] = true; - /* ffmpegvideoDlg版本 - ffmpegvideoDlg *videoDlg = ui->WgtffmpegVideo; - // 开始拉流 - videoDlg->m_flowType = m_DlgGDDCSet->m_FlowType; - videoDlg->setStreamIP(m_DlgGDDCSet->m_playURL1); - videoDlg->setPlayVideo(true); - // ui->WgtffmpegVideo->play(m_DlgGDDCSet->m_playURL1); - */ - - VideoWidget *videoWidget = ui->WgtffmpegVideo; - if (!videoWidget->play(m_DlgGDDCSet->m_playURL1)) { - g_notifyManager->notify("获取视频流失败!", "", 2, 3000); - // ui->WgtffmpegVideo->stopPlay(); - // m_DlgGDDCSet->setPullBtnText(false); - }; - } + if (!connectFlag[0]) { + connectFlag[0] = true; + /* ffmpegvideoDlg版本 + ffmpegvideoDlg *videoDlg = ui->WgtffmpegVideo; + // 开始拉流 + videoDlg->m_flowType = m_DlgGDDCSet->m_FlowType; + videoDlg->setStreamIP(m_DlgGDDCSet->m_playURL1); + videoDlg->setPlayVideo(true); + // ui->WgtffmpegVideo->play(m_DlgGDDCSet->m_playURL1); + */ + + VideoWidget *videoWidget = ui->WgtffmpegVideo; + if (!videoWidget->play(m_DlgGDDCSet->m_playURL1)) { + g_notifyManager->notify("获取视频流失败!", "", 2, 3000); + // ui->WgtffmpegVideo->stopPlay(); + // m_DlgGDDCSet->setPullBtnText(false); + }; + } } // 关闭视频1 void GDDCdlg::stopConnectURL1() { - if (connectFlag[0]) { - connectFlag[0] = false; - // ui->WgtffmpegVideo->setPlayVideo(false); - ui->WgtffmpegVideo->stopPlay(); - } + if (connectFlag[0]) { + connectFlag[0] = false; + // ui->WgtffmpegVideo->setPlayVideo(false); + ui->WgtffmpegVideo->stopPlay(); + } } // 播放视频2 void GDDCdlg::startConnectURL2() { - if (!connectFlag[1]) { - connectFlag[1] = true; - } + if (!connectFlag[1]) { + connectFlag[1] = true; + } } // 关闭视频2 void GDDCdlg::stopConnectURL2() { - if (connectFlag[1]) { - connectFlag[1] = false; - } + if (connectFlag[1]) { + connectFlag[1] = false; + } } void GDDCdlg::startConnectSerialCtrl() { - if (!connectFlag[2]) { - connectFlag[2] = true; - } + if (!connectFlag[2]) { + connectFlag[2] = true; + } } void GDDCdlg::stopConnectSerialCtrl() { - if (connectFlag[2]) { - connectFlag[2] = false; - } + if (connectFlag[2]) { + connectFlag[2] = false; + } } // 开始UDP控制通信 void GDDCdlg::startConnectUDPCtrl() { - if (!connectFlag[3]) { - /*启动定时器*/ - GDDCControlTimer = new QTimer(); - GDDCControlTimer->setInterval(100); - connect(GDDCControlTimer, &QTimer::timeout, this, [=]() { - GDDCControlTimeOut(); - }); - GDDCControlTimer->start(); - - // 创建udp socket对象 - udpSocket = new QUdpSocket(this); - /*接收*/ - // QList ipAddressesList = - // QNetworkInterface::allAddresses();//获取本机ip - udpSocket->bind(m_DlgGDDCSet->m_myPairNetwork.getLocalPort()); - connect(udpSocket, SIGNAL(readyRead()), this, - SLOT(UDPMessageReceive())); - connectFlag[3] = true; - } + if (!connectFlag[3]) { + /*启动定时器*/ + GDDCControlTimer = new QTimer(); + GDDCControlTimer->setInterval(40); + connect(GDDCControlTimer, &QTimer::timeout, this, + [=]() { GDDCControlTimeOut(); }); + GDDCControlTimer->start(); + + // 创建udp socket对象 + udpSocket = new QUdpSocket(this); + /*接收*/ + // QList ipAddressesList = + // QNetworkInterface::allAddresses();//获取本机ip + udpSocket->bind(m_DlgGDDCSet->m_myPairNetwork.getLocalPort()); + connect(udpSocket, SIGNAL(readyRead()), this, SLOT(UDPMessageReceive())); + connectFlag[3] = true; + } } // 停止UDP控制通信 void GDDCdlg::stopConnectUDPCtrl() { - if (connectFlag[3]) { - // 关闭定时器 - GDDCControlTimer->stop(); - delete GDDCControlTimer; - udpSocket->abort(); // 关闭套接字,并丢缓冲区中的所有待处理数据 - delete udpSocket; - connectFlag[3] = false; - } + if (connectFlag[3]) { + // 关闭定时器 + GDDCControlTimer->stop(); + delete GDDCControlTimer; + udpSocket->abort(); // 关闭套接字,并丢缓冲区中的所有待处理数据 + delete udpSocket; + connectFlag[3] = false; + } } // 开始TCP控制通信 void GDDCdlg::startConnectTCPCtrl() { - if (!connectFlag[4]) { - connectFlag[4] = true; - } + if (!connectFlag[4]) { + connectFlag[4] = true; + } } // 停止TCP控制通信 void GDDCdlg::stopConnectTCPCtrl() { - if (connectFlag[4]) { - connectFlag[4] = false; - } + if (connectFlag[4]) { + connectFlag[4] = false; + } } // 开始视频推流 void GDDCdlg::startPushURL() { - if (!connectFlag[5]) { - // //方式1:命令行推流 - // process = new QProcess(); - // connect(process, &QProcess::readyReadStandardOutput, this, [=]() - // mutable - // { - // QString Output = process->readAllStandardOutput(); - // qDebug() << "Output:" << Output; - // }); - // connect(process, &QProcess::readyReadStandardError, this, [=]() - // mutable { - // QString Error = process->readAllStandardError(); - // qDebug() << "Error Output:" << Error; - // }); - - // // process->start("cmd",QStringList()<<"/c"<<"ffmpeg -i - // // rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid -c copy - // -f flv - // // rtmp://182.92.130.23/app/test"); - - // QStringList m_cmd; - // QString str; - // // str = "ffmpeg -i " + m_DlgGDDCSet->m_playURL1 + " -c copy -f flv " - // + - // // m_DlgGDDCSet->m_pushURL; - // str = "ffmpeg -rtsp_transport tcp -i " + m_DlgGDDCSet->m_playURL1 + " - // -c:v libx264 -c:a copy -f flv " + - // m_DlgGDDCSet->m_pushURL; - // m_cmd << "/c" << str; - // process->start("cmd", m_cmd); - - // //方式2:代码推流 - // if(!connectFlag[0]) - // { - // QMessageBox::information(NULL, tr("提示"), "请先开始连接", - // QMessageBox::Ok); m_DlgGDDCSet->setPushStreamText("推送"); - // return; - // } - - /* ffmpegvideoDlg版本 - ffmpegvideoDlg *videoDlg = ui->WgtffmpegVideo; - videoDlg->setStreamIP(m_DlgGDDCSet->m_playURL1); - videoDlg->setPushStreamIP(m_DlgGDDCSet->m_pushURL); - qDebug() << "DLG:" << m_DlgGDDCSet->m_pushURL; - videoDlg->setPushStream(true); - */ - - ui->WgtffmpegVideo->setPullURL(m_DlgGDDCSet->m_playURL1); - if (!ui->WgtffmpegVideo->pushStream(m_DlgGDDCSet->m_pushURL)) { - g_notifyManager->notify("推流失败!", "", 2, 3000); - }; - m_DlgGDDCSet->setPushStreamText("停止推送"); - - connectFlag[5] = true; - } + if (!connectFlag[5]) { + // //方式1:命令行推流 + // process = new QProcess(); + // connect(process, &QProcess::readyReadStandardOutput, this, [=]() + // mutable + // { + // QString Output = process->readAllStandardOutput(); + // qDebug() << "Output:" << Output; + // }); + // connect(process, &QProcess::readyReadStandardError, this, [=]() + // mutable { + // QString Error = process->readAllStandardError(); + // qDebug() << "Error Output:" << Error; + // }); + + // // process->start("cmd",QStringList()<<"/c"<<"ffmpeg -i + // // rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid -c copy + // -f flv + // // rtmp://182.92.130.23/app/test"); + + // QStringList m_cmd; + // QString str; + // // str = "ffmpeg -i " + m_DlgGDDCSet->m_playURL1 + " -c copy -f flv " + // + + // // m_DlgGDDCSet->m_pushURL; + // str = "ffmpeg -rtsp_transport tcp -i " + m_DlgGDDCSet->m_playURL1 + " + // -c:v libx264 -c:a copy -f flv " + + // m_DlgGDDCSet->m_pushURL; + // m_cmd << "/c" << str; + // process->start("cmd", m_cmd); + + // //方式2:代码推流 + // if(!connectFlag[0]) + // { + // QMessageBox::information(NULL, tr("提示"), "请先开始连接", + // QMessageBox::Ok); m_DlgGDDCSet->setPushStreamText("推送"); + // return; + // } + + /* ffmpegvideoDlg版本 + ffmpegvideoDlg *videoDlg = ui->WgtffmpegVideo; + videoDlg->setStreamIP(m_DlgGDDCSet->m_playURL1); + videoDlg->setPushStreamIP(m_DlgGDDCSet->m_pushURL); + qDebug() << "DLG:" << m_DlgGDDCSet->m_pushURL; + videoDlg->setPushStream(true); + */ + + ui->WgtffmpegVideo->setPullURL(m_DlgGDDCSet->m_playURL1); + if (!ui->WgtffmpegVideo->pushStream(m_DlgGDDCSet->m_pushURL)) { + g_notifyManager->notify("推流失败!", "", 2, 3000); + }; + m_DlgGDDCSet->setPushStreamText("停止推送"); + + connectFlag[5] = true; + } } // 停止视频推流 void GDDCdlg::stopPushURL() { - if (connectFlag[5]) { - // //方式1:命令行推流 - // if (process != nullptr) { - // process->terminate(); - // process->close(); - // process->kill(); - // // 检查进程退出状态 - // if (process->exitStatus() == QProcess::CrashExit) { - // qDebug() << "Process crashed"; - // } else { - // qDebug() << "Process exited normally"; - // } - // delete process; - - // // 推流进程未自动关闭,手动关闭 - // int pids = GetmPid(L"ffmpeg.exe"); - // qDebug() << "ffmpeg.exe进程的pid为:" << pids; - // if (pids != 0) { - // QStringList m_cmd; - // m_cmd << "/c" << "taskkill /pid " << QString::number(pids) << " - // -f"; QProcess::startDetached("cmd", m_cmd); - // } - // } - - // 方式2:代码推流 - // ui->WgtffmpegVideo->setPushStream(false); - ui->WgtffmpegVideo->stopPushStream(); - m_DlgGDDCSet->setPushStreamText("推送"); - - connectFlag[5] = false; - } + if (connectFlag[5]) { + // //方式1:命令行推流 + // if (process != nullptr) { + // process->terminate(); + // process->close(); + // process->kill(); + // // 检查进程退出状态 + // if (process->exitStatus() == QProcess::CrashExit) { + // qDebug() << "Process crashed"; + // } else { + // qDebug() << "Process exited normally"; + // } + // delete process; + + // // 推流进程未自动关闭,手动关闭 + // int pids = GetmPid(L"ffmpeg.exe"); + // qDebug() << "ffmpeg.exe进程的pid为:" << pids; + // if (pids != 0) { + // QStringList m_cmd; + // m_cmd << "/c" << "taskkill /pid " << QString::number(pids) << " + // -f"; QProcess::startDetached("cmd", m_cmd); + // } + // } + + // 方式2:代码推流 + // ui->WgtffmpegVideo->setPushStream(false); + ui->WgtffmpegVideo->stopPushStream(); + m_DlgGDDCSet->setPushStreamText("推送"); + + connectFlag[5] = false; + } } // 设置页面弹出 void GDDCdlg::pushButtonSet_clicked() { - m_DlgGDDCSet->show(); - m_DlgGDDCSet->activateWindow(); // 置为顶层 + m_DlgGDDCSet->show(); + m_DlgGDDCSet->activateWindow(); // 置为顶层 } // udp数据接收 void GDDCdlg::UDPMessageReceive() { - QByteArray data; - data.resize(udpSocket->pendingDatagramSize()); - QHostAddress addr; - quint16 port; - udpSocket->readDatagram(data.data(), data.size(), &addr, &port); - - // 吊舱状态数据更新 - m_GDDCStateDlg->UDPMessageReceive(data, data.size()); + QByteArray data; + data.resize(udpSocket->pendingDatagramSize()); + QHostAddress addr; + quint16 port; + udpSocket->readDatagram(data.data(), data.size(), &addr, &port); + + // 吊舱状态数据更新 + m_GDDCStateDlg->UDPMessageReceive(data, data.size()); } // 控制页面隐藏与显示 void GDDCdlg::pushButShowCmdPage_clicked() { - if (isCmdPageShow) { - m_GDDCCmdDlg->setVisible(false); - isCmdPageShow = false; - resizeUI(); - ui->pushButShowCmdPage->setIcon(QIcon(":/res/up.png")); - // ui->pushButton->setGeometry(this->width()/2,this->height()-50,50,50); - } else { - m_GDDCCmdDlg->setVisible(true); - isCmdPageShow = true; - resizeUI(); - ui->pushButShowCmdPage->setIcon(QIcon(":/res/down.png")); - // ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50); - } + if (isCmdPageShow) { + m_GDDCCmdDlg->setVisible(false); + isCmdPageShow = false; + resizeUI(); + ui->pushButShowCmdPage->setIcon(QIcon(":/res/left.png")); + // ui->pushButton->setGeometry(this->width()/2,this->height()-50,50,50); + } else { + m_GDDCCmdDlg->setVisible(true); + isCmdPageShow = true; + resizeUI(); + ui->pushButShowCmdPage->setIcon(QIcon(":/res/right.png")); + // ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50); + } } // 状态页面隐藏与显示 void GDDCdlg::pushButShowStatePage_clicked() { - if (isStatePageShow) { - m_GDDCStateDlg->setVisible(false); - isStatePageShow = false; - resizeUI(); - ui->pushButShowStatePage->setIcon(QIcon(":/res/left.png")); - } else { - m_GDDCStateDlg->setVisible(true); - isStatePageShow = true; - resizeUI(); - ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png")); - // ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50); - } + if (isStatePageShow) { + m_GDDCStateDlg->setVisible(false); + isStatePageShow = false; + resizeUI(); + ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png")); + } else { + m_GDDCStateDlg->setVisible(true); + isStatePageShow = true; + resizeUI(); + ui->pushButShowStatePage->setIcon(QIcon(":/res/left.png")); + // ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50); + } } void GDDCdlg::showErrorMessage(QString message, int type) { - g_notifyManager->notify(message, "", type, 3000); + g_notifyManager->notify(message, "", type, 3000); +} + +//鼠标滚轮事件 +void GDDCdlg::wheelEvent(QWheelEvent *event) +{ + if(ui->WgtffmpegVideo->underMouse()) + { + // 获取滚轮的滚动方向和角度增量 + _delta = event->angleDelta().y(); + QPointF currentLocation = event->position(); + // qDebug() << "当前位置:" << currentLocation; + + if (_delta > 0) + { + // 向上滚动 + //qDebug() << "鼠标滚轮向上滚动" << " 步长:" << _delta; + // if(wheelSub->isVisible()) + // { + // wheelSub->hide(); + // } + // wheelPlus->move((currentLocation - QPoint(wheelPlus->width()/2, wheelPlus->height()/2)).toPoint()); + // wheelPlus->show(); + emit wheelSendData(_delta); + } + else if (_delta < 0) + { + // 向下滚动 + // if(wheelPlus->isVisible()) + // { + // wheelPlus->hide(); + // } + // wheelSub->move((currentLocation - QPoint(wheelSub->width()/2, wheelSub->height()/2)).toPoint()); + // wheelSub->show(); + emit wheelSendData(_delta); + //qDebug() << "鼠标滚轮事向下滚动" << " 步长:" << _delta; + } + + if(!_wheelStopTime->isActive()) + { + _wheelStopTime->start(); + } + else + { + _wheelStopTime->stop(); + _wheelStopTime->start(); + } + } + QWidget::wheelEvent(event); } diff --git a/Src/GDDC/gddcdlg.h b/Src/GDDC/gddcdlg.h index 623d4fd..d900383 100644 --- a/Src/GDDC/gddcdlg.h +++ b/Src/GDDC/gddcdlg.h @@ -17,14 +17,17 @@ #include #include -#include "gddcCmdDlg.h" //吊舱控制对话框 +#include "gddcCmdDlg.h" //吊舱控制对话框 #include "global.h" // #include "ui_gddcCmdDlg.h" //吊舱控制对话框ui -#include "gddcStateInfo.h" //吊舱状态信息显示对话框 +#include "gddcStateInfo.h" //吊舱状态信息显示对话框 // #include "ui_gddcStateInfo.h" //吊舱状态信息显示对话框 // #include "ui_gddcSet.h" #include #include +#include +#include +#include #include "QProcess" @@ -34,74 +37,91 @@ class GDDCdlg; } class GDDCdlg : public QWidget { - Q_OBJECT + Q_OBJECT public: - explicit GDDCdlg(QWidget *parent = nullptr); - ~GDDCdlg(); + explicit GDDCdlg(QWidget *parent = nullptr); + ~GDDCdlg(); private: - Ui::GDDCdlg *ui; - QTimer *GDDCControlTimer; + Ui::GDDCdlg *ui; + QTimer *GDDCControlTimer; protected: - void resizeEvent(QResizeEvent *event); + void resizeEvent(QResizeEvent *event); public: - void initWindow(); // 初始化窗口 - void initParam(); // 初始化参数 - void initSignalSlot(); // 初始化信号与槽 - void resizeUI(); // 重新设置布局 - void setGlobalSetMap(std::unordered_map &gSetMap); + void initWindow(); // 初始化窗口 + void initParam(); // 初始化参数 + void initSignalSlot(); // 初始化信号与槽 + void resizeUI(); // 重新设置布局 + void setGlobalSetMap(std::unordered_map &gSetMap); - GDDCSet *m_DlgGDDCSet; // 光电吊舱设置对话框 - GDDCCmdDlg *m_GDDCCmdDlg; // 光电吊舱控制对话框 - GDDCStateInfo *m_GDDCStateDlg; // 光电吊舱状态数据对话框 + GDDCSet *m_DlgGDDCSet; // 光电吊舱设置对话框 + GDDCCmdDlg *m_GDDCCmdDlg; // 光电吊舱控制对话框 + GDDCStateInfo *m_GDDCStateDlg; // 光电吊舱状态数据对话框 public: - // socket对象 - QUdpSocket *udpSocket; - // QString RemoteIP; //目标IP - // QHostAddress RemoteAddr; //目标地址 - // quint16 RemotePort; //目标port - QString localIP; // 本地IP - QHostAddress localAddr; // 本地地址 - quint16 localPort; // 本地port - QProcess *process; // 执行CMD - QThread workerThread; // 线程 - // bool eventFilter(QObject *,QEvent *); //事件过滤器 - void mousePressEvent(QMouseEvent *event); // 事件过滤器 - void mouseMoveEvent(QMouseEvent *event); // 事件过滤器 + // socket对象 + QUdpSocket *udpSocket; + // QString RemoteIP; //目标IP + // QHostAddress RemoteAddr; //目标地址 + // quint16 RemotePort; //目标port + QString localIP; // 本地IP + QHostAddress localAddr; // 本地地址 + quint16 localPort; // 本地port + QProcess *process; // 执行CMD + QThread workerThread; // 线程 + // bool eventFilter(QObject *,QEvent *); //事件过滤器 + void mousePressEvent(QMouseEvent *event) override; // 事件过滤器 + void mouseMoveEvent(QMouseEvent *event) override; // 事件过滤器 + void mouseReleaseEvent(QMouseEvent *event) override; - void startConnectURL1(); - void stopConnectURL1(); - void startConnectURL2(); - void stopConnectURL2(); - void startConnectSerialCtrl(); - void stopConnectSerialCtrl(); - void startConnectUDPCtrl(); - void stopConnectUDPCtrl(); - void startConnectTCPCtrl(); - void stopConnectTCPCtrl(); - void startPushURL(); - void stopPushURL(); + void startConnectURL1(); + void stopConnectURL1(); + void startConnectURL2(); + void stopConnectURL2(); + void startConnectSerialCtrl(); + void stopConnectSerialCtrl(); + void startConnectUDPCtrl(); + void stopConnectUDPCtrl(); + void startConnectTCPCtrl(); + void stopConnectTCPCtrl(); + void startPushURL(); + void stopPushURL(); public: - bool pointSelectionTracking; // 选点跟踪 - bool Is_openVideo; // 视频是否已打开,默认未打开 - std::vector connectFlag; // 0视频流1;1视频流2;2串口通信,3网口通信 - bool isCmdPageShow; // 控制页是否显示 - bool isStatePageShow; // 状态页是否显示 - bool detectionAreaSetting; // 检测区域设置 + bool pointSelectionTracking; // 选点跟踪 + bool Is_openVideo; // 视频是否已打开,默认未打开 + std::vector connectFlag; // 0视频流1;1视频流2;2串口通信,3网口通信 + bool isCmdPageShow; // 控制页是否显示 + bool isStatePageShow; // 状态页是否显示 + bool detectionAreaSetting; // 检测区域设置 public slots: - void GDDCControlTimeOut(); - void startConnect(int); // 开始连接 - void stopConnect(int); // 停止连接 - void UDPMessageReceive(); // udp数据接收 - void pushButtonSet_clicked(); - void pushButShowCmdPage_clicked(); - void pushButShowStatePage_clicked(); + void GDDCControlTimeOut(); + void startConnect(int); // 开始连接 + void stopConnect(int); // 停止连接 + void UDPMessageReceive(); // udp数据接收 + void pushButtonSet_clicked(); + void pushButShowCmdPage_clicked(); + void pushButShowStatePage_clicked(); + + void showErrorMessage(QString message, int type); - void showErrorMessage(QString message, int type); +protected: + void wheelEvent(QWheelEvent* event) override; +private: + int _delta; //滚轮滚动量 + QTimer *_wheelStopTime; + QPointF _dragStartPositon; //记录滑动操作当前点击的局部坐标 + bool _dragFlag; //记录滑动初始标志 + bool _moveFlag; //记录正在滑动中的标志 + QLabel* firstLocation; + QLabel* lastLocation; + // QPointF _currentLocation; //记录鼠标当前位置 + QLabel* wheelPlus; //鼠标+图标 + QLabel* wheelSub; //鼠标-图标 +signals: + void wheelSendData(int value); }; -#endif // GDDCDLG_H +#endif // GDDCDLG_H diff --git a/Src/GDDC/res.qrc b/Src/GDDC/res.qrc new file mode 100644 index 0000000..55b2660 --- /dev/null +++ b/Src/GDDC/res.qrc @@ -0,0 +1,13 @@ + + + Pod/podDown.png + Pod/podLeft.png + Pod/podRight.png + Pod/podUp.png + Pod/Center.png + Pod/c.png + Pod/circle.png + Pod/plus.png + Pod/sub.png + + diff --git a/Src/Video/cffmpeg_decode.cpp b/Src/Video/cffmpeg_decode.cpp index d635d5a..051bcd8 100644 --- a/Src/Video/cffmpeg_decode.cpp +++ b/Src/Video/cffmpeg_decode.cpp @@ -85,7 +85,7 @@ bool Cffmpeg_decode::open_input_file() { // av_dict_set(&avdic, "listen_timeout", "200000", 0); // 在尝试连接到一个流或网络资源时,等待的最长时间。如果在这个时间内无法建立连接,就会返回超时错误 av_dict_set(&avdic, "stimeout", "5000000", 0); // 设置超时5秒 - // av_dict_set(&avdic, "max_delay", "300000", 0); // 设置最大时延300ms + av_dict_set(&avdic, "max_delay", "300000", 0); // 设置最大时延300ms av_dict_set(&avdic, "tune", "zerolatency", 0); // 实时编码 av_dict_set(&avdic, "preset", "ultrafast", 0); // faster // av_dict_set(&avdic, "threads", "auto", 0); // 自动开启线程数 diff --git a/Src/VideoGL/videowidget.cpp b/Src/VideoGL/videowidget.cpp index 2de644d..3bf47e9 100644 --- a/Src/VideoGL/videowidget.cpp +++ b/Src/VideoGL/videowidget.cpp @@ -572,3 +572,8 @@ void VideoWidget::receiveErrorMessage(QString message, int type) { // qDebug() << "receive message:" << message; emit sendErrorMessageSignal(message, type); } + +QSizeF VideoWidget::getCurImgSize() +{ + return m_zoomSize; +} diff --git a/Src/VideoGL/videowidget.h b/Src/VideoGL/videowidget.h index 235e89f..b3c67e5 100644 --- a/Src/VideoGL/videowidget.h +++ b/Src/VideoGL/videowidget.h @@ -113,6 +113,8 @@ private: signals: void startPullSignal(); void sendErrorMessageSignal(QString message, int type); +public: + QSizeF getCurImgSize(); }; #endif // VIDEOWIDGET_H diff --git a/main.cpp b/main.cpp index 0432eee..002d08c 100644 --- a/main.cpp +++ b/main.cpp @@ -2,12 +2,13 @@ #include #include #include - +#include #include "mainwindow.h" int main(int argc, char *argv[]) { // QApplication::setAttribute(Qt::AA_UseOpenGLES); // qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--enable-gpu-rasterization"); + QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL); QApplication a(argc, argv); QTranslator translator; const QStringList uiLanguages = QLocale::system().uiLanguages();