Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
Oil_Level_Recognition_System
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
柳青君
Oil_Level_Recognition_System
Commits
a4f905c9
Commit
a4f905c9
authored
Nov 26, 2025
by
Yuhaibo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1
parent
bd3dd6ab
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
147 additions
and
145 deletions
+147
-145
CLEANUP_PROGRESS.md
handlers/CLEANUP_PROGRESS.md
+16
-12
datapreprocess_handler.py
handlers/datasetpage/datapreprocess_handler.py
+7
-7
model_test_handler.py
handlers/modelpage/model_test_handler.py
+8
-17
curvepanel_handler.py
handlers/videopage/curvepanel_handler.py
+8
-16
thread_manager.py
handlers/videopage/thread_manager/thread_manager.py
+8
-14
style_manager.py
widgets/style_manager.py
+98
-0
curvepanel.py
widgets/videopage/curvepanel.py
+0
-4
general_set.py
widgets/videopage/general_set.py
+1
-49
historyvideopanel.py
widgets/videopage/historyvideopanel.py
+1
-26
No files found.
handlers/CLEANUP_PROGRESS.md
View file @
a4f905c9
...
@@ -110,9 +110,12 @@
...
@@ -110,9 +110,12 @@
11.
✅
**handlers/videopage/thread_manager/threads/storage_thread.py**
- 删除9处print语句
11.
✅
**handlers/videopage/thread_manager/threads/storage_thread.py**
- 删除9处print语句
12.
✅
**handlers/videopage/thread_manager/threads/display_thread.py**
- 删除5处print语句
12.
✅
**handlers/videopage/thread_manager/threads/display_thread.py**
- 删除5处print语句
13.
✅
**widgets/videopage/missionpanel.py**
- 删除约20处print语句
13.
✅
**widgets/videopage/missionpanel.py**
- 删除约20处print语句
14.
✅
**widgets/videopage/general_set.py**
- 删除约30处print语句
15.
✅
**widgets/videopage/curvepanel.py**
- 删除4处print语句
16.
✅
**widgets/videopage/historyvideopanel.py**
- 删除约15处print语句
### 部分清理
### 部分清理
1
4
.
🔄
**handlers/videopage/missionpanel_handler.py**
- 已清理前330行,删除约20处print语句(文件共2050行,需继续清理)
1
7
.
🔄
**handlers/videopage/missionpanel_handler.py**
- 已清理前330行,删除约20处print语句(文件共2050行,需继续清理)
## 清理进度说明
## 清理进度说明
...
@@ -128,13 +131,14 @@
...
@@ -128,13 +131,14 @@
-
🔄 handlers/videopage/missionpanel_handler.py (进行中)
-
🔄 handlers/videopage/missionpanel_handler.py (进行中)
-
⏳ handlers/videopage/detection.py
-
⏳ handlers/videopage/detection.py
2.
**中优先级**
- UI组件和样式管理 (已完成
部分
)
2.
**中优先级**
- UI组件和样式管理 (已完成)
-
✅ widgets/style_manager.py
-
✅ widgets/style_manager.py
-
✅ widgets/responsive_layout.py
-
✅ widgets/responsive_layout.py
-
✅ widgets/videopage/channelpanel.py
-
✅ widgets/videopage/channelpanel.py
-
✅ widgets/videopage/missionpanel.py
-
✅ widgets/videopage/missionpanel.py
-
⏳ widgets/videopage/general_set.py
-
✅ widgets/videopage/general_set.py
-
⏳ widgets/videopage/curvepanel.py
-
✅ widgets/videopage/curvepanel.py
-
✅ widgets/videopage/historyvideopanel.py
3.
**低优先级**
- 测试文件和工具脚本
3.
**低优先级**
- 测试文件和工具脚本
-
⏳ handlers/modelpage/tools/
*
.py
-
⏳ handlers/modelpage/tools/
*
.py
...
@@ -142,13 +146,13 @@
...
@@ -142,13 +146,13 @@
-
⏳ widgets/datasetpage/test_
*
.py
-
⏳ widgets/datasetpage/test_
*
.py
### 剩余工作量估算
### 剩余工作量估算
-
已清理: 约2
34处调试语句 (13
个文件完全清理 + 1个文件部分清理)
-
已清理: 约2
83处调试语句 (16
个文件完全清理 + 1个文件部分清理)
-
剩余: 约3
207
处调试语句
-
剩余: 约3
158
处调试语句
-
预计需要: 继续手动清理约
50
个文件
-
预计需要: 继续手动清理约
47
个文件
### 本次清理总结 (2025-11-26 20:
2
0)
### 本次清理总结 (2025-11-26 20:
3
0)
-
完成文件数: 1
3
个完全清理 + 1个部分清理
-
完成文件数: 1
6
个完全清理 + 1个部分清理
-
删除调试语句: 约2
34
处
-
删除调试语句: 约2
83
处
-
主要清理内容:
-
主要清理内容:
-
核心应用入口和窗口管理 (app.py)
-
核心应用入口和窗口管理 (app.py)
-
视图布局切换管理 (view_handler.py)
-
视图布局切换管理 (view_handler.py)
...
@@ -156,9 +160,9 @@
...
@@ -156,9 +160,9 @@
-
通道面板UI和Handler (channelpanel.py, channelpanel_handler.py)
-
通道面板UI和Handler (channelpanel.py, channelpanel_handler.py)
-
曲线面板Handler (curvepanel_handler.py)
-
曲线面板Handler (curvepanel_handler.py)
-
完整线程管理系统 (thread_manager.py, curve_thread.py, global_detection_thread.py, storage_thread.py, display_thread.py)
-
完整线程管理系统 (thread_manager.py, curve_thread.py, global_detection_thread.py, storage_thread.py, display_thread.py)
-
任务面板UI (mission
panel.py)
-
完整UI组件系统 (missionpanel.py, general_set.py, curvepanel.py, historyvideo
panel.py)
-
部分任务面板Handler (missionpanel_handler.py)
-
部分任务面板Handler (missionpanel_handler.py)
---
---
*最后更新: 2025-11-26 20:
2
0*
*最后更新: 2025-11-26 20:
3
0*
handlers/datasetpage/datapreprocess_handler.py
View file @
a4f905c9
...
@@ -2235,16 +2235,16 @@ class DataPreprocessHandler(QtCore.QObject):
...
@@ -2235,16 +2235,16 @@ class DataPreprocessHandler(QtCore.QObject):
end_t
=
self
.
_formatTimeFromFrame
(
end_f
)
end_t
=
self
.
_formatTimeFromFrame
(
end_f
)
time_range_str
=
f
" (时间段: {start_t} - {end_t})"
time_range_str
=
f
" (时间段: {start_t} - {end_t})"
# 创建进度对话框
#
🔥 使用全局DialogManager
创建进度对话框
progress_title
=
"裁剪进度"
+
time_range_str
progress_title
=
"裁剪进度"
+
time_range_str
progress_label
=
"正在裁剪视频帧"
+
time_range_str
+
"..."
progress_label
=
"正在裁剪视频帧"
+
time_range_str
+
"..."
progress_dialog
=
QtWidgets
.
QProgressDialog
(
progress_dialog
=
DialogManager
.
create_progress_dialog
(
progress_label
,
"取消"
,
0
,
100
,
self
.
_panel
parent
=
self
.
_panel
,
title
=
progress_title
,
label_text
=
progress_label
,
icon_name
=
"裁剪"
,
# 使用icons目录中的"裁剪"图标
cancelable
=
True
)
)
progress_dialog
.
setWindowTitle
(
progress_title
)
progress_dialog
.
setWindowModality
(
Qt
.
WindowModal
)
progress_dialog
.
setMinimumDuration
(
0
)
progress_dialog
.
setValue
(
0
)
try
:
try
:
# 提取配置
# 提取配置
...
...
handlers/modelpage/model_test_handler.py
View file @
a4f905c9
...
@@ -452,23 +452,14 @@ class ModelTestHandler:
...
@@ -452,23 +452,14 @@ class ModelTestHandler:
"""
"""
self
.
training_panel
.
display_panel
.
setHtml
(
start_html
)
self
.
training_panel
.
display_panel
.
setHtml
(
start_html
)
# 创建进度对话框
# 🔥 使用全局DialogManager创建进度对话框
progress_dialog
=
QtWidgets
.
QProgressDialog
(
from
widgets.style_manager
import
DialogManager
"正在准备测试..."
,
progress_dialog
=
DialogManager
.
create_progress_dialog
(
"取消"
,
# 取消按钮文本改为中文
parent
=
self
.
training_panel
,
0
,
100
,
title
=
"模型测试进度"
,
self
.
training_panel
label_text
=
"正在准备测试..."
,
)
icon_name
=
"model"
,
progress_dialog
.
setWindowTitle
(
"模型测试进度"
)
cancelable
=
True
progress_dialog
.
setWindowModality
(
QtCore
.
Qt
.
WindowModal
)
progress_dialog
.
setMinimumDuration
(
0
)
# 立即显示
# 设置窗口图标为model图标
progress_dialog
.
setWindowIcon
(
newIcon
(
"model"
))
# 删除右上角的"?"按钮(帮助按钮)
progress_dialog
.
setWindowFlags
(
progress_dialog
.
windowFlags
()
&
~
QtCore
.
Qt
.
WindowContextHelpButtonHint
)
)
# 应用全局进度条样式管理器到进度对话框中的进度条
# 应用全局进度条样式管理器到进度对话框中的进度条
...
...
handlers/videopage/curvepanel_handler.py
View file @
a4f905c9
...
@@ -852,27 +852,19 @@ class CurvePanelHandler:
...
@@ -852,27 +852,19 @@ class CurvePanelHandler:
if
file_size_mb
>
8
:
if
file_size_mb
>
8
:
show_progress
=
True
show_progress
=
True
# 创建进度对话框(仅在需要时)
#
🔥 使用全局DialogManager
创建进度对话框(仅在需要时)
progress_dialog
=
None
progress_dialog
=
None
if
show_progress
:
if
show_progress
:
progress_dialog
=
QtWidgets
.
QProgressDialog
(
from
widgets.style_manager
import
DialogManager
"正在加载曲线数据..."
,
progress_dialog
=
DialogManager
.
create_progress_dialog
(
"取消"
,
parent
=
None
,
# 全局进度条,无父窗口
0
,
title
=
"曲线数据加载进度"
,
100
# 使用百分比进度
label_text
=
"正在加载曲线数据..."
,
icon_name
=
"动态曲线"
,
cancelable
=
False
# 不可取消
)
)
progress_dialog
.
setWindowTitle
(
"曲线数据加载进度"
)
# 🔥 使用应用程序模态,确保进度条显示在最前面
progress_dialog
.
setWindowModality
(
QtCore
.
Qt
.
ApplicationModal
)
progress_dialog
.
setWindowModality
(
QtCore
.
Qt
.
ApplicationModal
)
progress_dialog
.
setMinimumWidth
(
400
)
progress_dialog
.
setMinimumWidth
(
400
)
# 🔥 设置最小显示时间(毫秒),避免闪烁
progress_dialog
.
setMinimumDuration
(
0
)
# 立即显示
progress_dialog
.
setWindowIcon
(
newIcon
(
"动态曲线"
))
progress_dialog
.
setWindowFlags
(
progress_dialog
.
windowFlags
()
&
~
QtCore
.
Qt
.
WindowContextHelpButtonHint
)
progress_dialog
.
setCancelButton
(
None
)
progress_dialog
.
setValue
(
0
)
# 设置初始值
progress_dialog
.
show
()
progress_dialog
.
show
()
# 🔥 强制刷新UI,确保进度条立即显示
# 🔥 强制刷新UI,确保进度条立即显示
QtWidgets
.
QApplication
.
processEvents
()
QtWidgets
.
QApplication
.
processEvents
()
...
...
handlers/videopage/thread_manager/thread_manager.py
View file @
a4f905c9
...
@@ -363,24 +363,18 @@ class ChannelThreadManager:
...
@@ -363,24 +363,18 @@ class ChannelThreadManager:
if
show_progress
:
if
show_progress
:
try
:
try
:
from
qtpy
import
QtWidgets
,
QtCore
from
qtpy
import
QtWidgets
,
QtCore
from
widgets.style_manager
import
newIcon
from
widgets.style_manager
import
DialogManager
progress_dialog
=
QtWidgets
.
QProgressDialog
(
# 🔥 使用全局DialogManager创建进度对话框
"正在加载曲线数据..."
,
progress_dialog
=
DialogManager
.
create_progress_dialog
(
"取消"
,
parent
=
None
,
# 全局进度条,无父窗口
0
,
title
=
"曲线数据加载进度"
,
100
# 使用百分比进度
label_text
=
"正在加载曲线数据..."
,
icon_name
=
"动态曲线"
,
cancelable
=
False
# 不可取消
)
)
progress_dialog
.
setWindowTitle
(
"曲线数据加载进度"
)
progress_dialog
.
setWindowModality
(
QtCore
.
Qt
.
ApplicationModal
)
progress_dialog
.
setWindowModality
(
QtCore
.
Qt
.
ApplicationModal
)
progress_dialog
.
setMinimumWidth
(
400
)
progress_dialog
.
setMinimumWidth
(
400
)
progress_dialog
.
setMinimumDuration
(
0
)
# 立即显示
progress_dialog
.
setWindowIcon
(
newIcon
(
"动态曲线"
))
progress_dialog
.
setWindowFlags
(
progress_dialog
.
windowFlags
()
&
~
QtCore
.
Qt
.
WindowContextHelpButtonHint
)
progress_dialog
.
setCancelButton
(
None
)
progress_dialog
.
setValue
(
0
)
progress_dialog
.
show
()
progress_dialog
.
show
()
QtWidgets
.
QApplication
.
processEvents
()
QtWidgets
.
QApplication
.
processEvents
()
...
...
widgets/style_manager.py
View file @
a4f905c9
...
@@ -388,6 +388,104 @@ class DialogManager:
...
@@ -388,6 +388,104 @@ class DialogManager:
return
msg_box
.
exec_
()
return
msg_box
.
exec_
()
@staticmethod
@staticmethod
def
show_information_with_details
(
parent
,
title
,
message
,
detail_info
=
""
,
custom_buttons
=
None
):
"""显示带详细信息和自定义按钮的信息对话框
Args:
parent: 父窗口
title: 对话框标题
message: 主要消息文本
detail_info: 详细信息文本
custom_buttons: 自定义按钮列表,格式为 [(按钮文本, 按钮角色), ...]
例如: [("打开文件夹", QtWidgets.QMessageBox.ActionRole)]
Returns:
str: 被点击的按钮文本,如果是标准按钮则返回None
"""
msg_box
=
DialogManager
.
_create_base_dialog
(
parent
,
title
,
message
,
QtWidgets
.
QStyle
.
SP_MessageBoxInformation
)
# 设置详细信息
if
detail_info
:
msg_box
.
setInformativeText
(
detail_info
)
# 添加自定义按钮
custom_button_widgets
=
{}
if
custom_buttons
:
for
button_text
,
button_role
in
custom_buttons
:
btn
=
msg_box
.
addButton
(
button_text
,
button_role
)
custom_button_widgets
[
btn
]
=
button_text
# 添加标准"确定"按钮
ok_btn
=
msg_box
.
addButton
(
"确定"
,
QtWidgets
.
QMessageBox
.
AcceptRole
)
# 执行对话框
msg_box
.
exec_
()
# 获取被点击的按钮
clicked_button
=
msg_box
.
clickedButton
()
# 如果是自定义按钮,返回按钮文本
if
clicked_button
in
custom_button_widgets
:
return
custom_button_widgets
[
clicked_button
]
return
None
@staticmethod
def
create_progress_dialog
(
parent
,
title
,
label_text
,
icon_name
=
None
,
cancelable
=
True
):
"""创建进度对话框
Args:
parent: 父窗口
title: 对话框标题
label_text: 进度标签文本
icon_name: 图标名称(从icons目录加载),如"裁剪"、"动态曲线"等
cancelable: 是否显示取消按钮
Returns:
QProgressDialog: 配置好的进度对话框
"""
# 创建进度对话框
cancel_text
=
"取消"
if
cancelable
else
None
progress_dialog
=
QtWidgets
.
QProgressDialog
(
label_text
,
cancel_text
,
0
,
100
,
parent
)
# 设置标题
progress_dialog
.
setWindowTitle
(
title
)
# 设置模态
progress_dialog
.
setWindowModality
(
QtCore
.
Qt
.
WindowModal
)
# 立即显示
progress_dialog
.
setMinimumDuration
(
0
)
# 设置初始值
progress_dialog
.
setValue
(
0
)
# 🔥 移除帮助按钮
progress_dialog
.
setWindowFlags
(
progress_dialog
.
windowFlags
()
&
~
QtCore
.
Qt
.
WindowContextHelpButtonHint
)
# 🔥 设置左上角图标(使用icons目录中的图标)
if
icon_name
:
icon
=
newIcon
(
icon_name
)
if
not
icon
.
isNull
():
progress_dialog
.
setWindowIcon
(
icon
)
# 如果不可取消,移除取消按钮
if
not
cancelable
:
progress_dialog
.
setCancelButton
(
None
)
# 🔥 应用全局字体管理器
FontManager
.
applyToWidgetRecursive
(
progress_dialog
)
return
progress_dialog
@staticmethod
def
set_default_style
(
style_sheet
):
def
set_default_style
(
style_sheet
):
"""设置默认样式"""
"""设置默认样式"""
DialogManager
.
DEFAULT_STYLE
=
style_sheet
DialogManager
.
DEFAULT_STYLE
=
style_sheet
...
...
widgets/videopage/curvepanel.py
View file @
a4f905c9
...
@@ -516,19 +516,16 @@ class CurvePanel(QtWidgets.QWidget):
...
@@ -516,19 +516,16 @@ class CurvePanel(QtWidgets.QWidget):
if
not
task_name
or
task_name
==
"未分配任务"
or
task_name
==
"None"
:
if
not
task_name
or
task_name
==
"未分配任务"
or
task_name
==
"None"
:
# 选中默认选项
# 选中默认选项
self
.
curvemission
.
setCurrentIndex
(
0
)
self
.
curvemission
.
setCurrentIndex
(
0
)
print
(
f
"⚠️ [CurvePanel] 无效任务名称,重置为默认选项: {task_name}"
)
return
False
return
False
# 在下拉框中查找并选中对应的任务
# 在下拉框中查找并选中对应的任务
index
=
self
.
curvemission
.
findText
(
task_name
)
index
=
self
.
curvemission
.
findText
(
task_name
)
if
index
>=
0
:
if
index
>=
0
:
self
.
curvemission
.
setCurrentIndex
(
index
)
self
.
curvemission
.
setCurrentIndex
(
index
)
print
(
f
"✅ [CurvePanel] 已设置任务: {task_name} (索引: {index})"
)
return
True
return
True
else
:
else
:
# 如果找不到,选中默认选项
# 如果找不到,选中默认选项
self
.
curvemission
.
setCurrentIndex
(
0
)
self
.
curvemission
.
setCurrentIndex
(
0
)
print
(
f
"⚠️ [CurvePanel] 未找到任务 '{task_name}',重置为默认选项"
)
return
False
return
False
def
addChannel
(
self
,
channel_id
,
channel_name
=
None
,
window_name
=
None
,
color
=
None
):
def
addChannel
(
self
,
channel_id
,
channel_name
=
None
,
window_name
=
None
,
color
=
None
):
...
@@ -684,7 +681,6 @@ class CurvePanel(QtWidgets.QWidget):
...
@@ -684,7 +681,6 @@ class CurvePanel(QtWidgets.QWidget):
self
.
plot_widget
.
setYRange
(
min_value
,
max_value
,
padding
=
0
)
self
.
plot_widget
.
setYRange
(
min_value
,
max_value
,
padding
=
0
)
# 固定X轴位置
# 固定X轴位置
self
.
_fixXAxisPosition
()
self
.
_fixXAxisPosition
()
print
(
f
" 设置Y轴范围: {min_value} ~ {max_value}"
)
def
setSafetyLimits
(
self
,
upper_limit
,
lower_limit
):
def
setSafetyLimits
(
self
,
upper_limit
,
lower_limit
):
"""
"""
...
...
widgets/videopage/general_set.py
View file @
a4f905c9
...
@@ -742,7 +742,6 @@ class GeneralSetPanel(QtWidgets.QWidget):
...
@@ -742,7 +742,6 @@ class GeneralSetPanel(QtWidgets.QWidget):
self
.
model_setting_widget
.
readModelDescriptionRequested
.
emit
(
absolute_path
)
self
.
model_setting_widget
.
readModelDescriptionRequested
.
emit
(
absolute_path
)
except
Exception
as
e
:
except
Exception
as
e
:
print
(
f
"[GeneralSetPanel] 应用模型配置失败: {e}"
)
import
traceback
import
traceback
traceback
.
print_exc
()
traceback
.
print_exc
()
...
@@ -754,7 +753,6 @@ class GeneralSetPanel(QtWidgets.QWidget):
...
@@ -754,7 +753,6 @@ class GeneralSetPanel(QtWidgets.QWidget):
model_path: 新选择的模型路径(绝对路径)
model_path: 新选择的模型路径(绝对路径)
"""
"""
if
not
self
.
channel_id
:
if
not
self
.
channel_id
:
print
(
f
"[GeneralSetPanel] 无法保存:channel_id 为空"
)
return
return
# 发送信号给handler处理实际的文件保存逻辑
# 发送信号给handler处理实际的文件保存逻辑
...
@@ -1053,12 +1051,10 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1053,12 +1051,10 @@ class AnnotationWidget(QtWidgets.QWidget):
def
_applyFullScreen
(
self
):
def
_applyFullScreen
(
self
):
"""应用全屏模式(延迟调用,确保控件已初始化)"""
"""应用全屏模式(延迟调用,确保控件已初始化)"""
self
.
showFullScreen
()
self
.
showFullScreen
()
print
(
f
"[AnnotationWidget] 已应用全屏模式,image_label大小: {self.image_label.width()}x{self.image_label.height()}"
)
# 🔥 关键修复:全屏后立即更新显示,确保标注帧立即全屏显示
# 🔥 关键修复:全屏后立即更新显示,确保标注帧立即全屏显示
if
self
.
current_frame
is
not
None
:
if
self
.
current_frame
is
not
None
:
self
.
_updateDisplay
()
self
.
_updateDisplay
()
print
(
f
"[AnnotationWidget] 已更新显示内容"
)
def
setAnnotationEngine
(
self
,
engine
):
def
setAnnotationEngine
(
self
,
engine
):
"""设置标注引擎"""
"""设置标注引擎"""
...
@@ -1100,7 +1096,6 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1100,7 +1096,6 @@ class AnnotationWidget(QtWidgets.QWidget):
elif
current_state
==
"满"
:
elif
current_state
==
"满"
:
self
.
area_states
[
area_index
]
=
"默认"
self
.
area_states
[
area_index
]
=
"默认"
print
(
f
"区域 {area_index+1} 状态已切换为: {self.area_states[area_index]}"
)
self
.
_updateDisplay
()
self
.
_updateDisplay
()
def
loadFrame
(
self
,
frame
):
def
loadFrame
(
self
,
frame
):
...
@@ -1522,9 +1517,6 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1522,9 +1517,6 @@ class AnnotationWidget(QtWidgets.QWidget):
# 设置对齐方式为居中,这样图像会自动居中显示
# 设置对齐方式为居中,这样图像会自动居中显示
self
.
image_label
.
setAlignment
(
Qt
.
AlignCenter
)
self
.
image_label
.
setAlignment
(
Qt
.
AlignCenter
)
print
(
f
"[显示图像] 原始尺寸: {img_width}x{img_height}, 缩放后: {scaled_width}x{scaled_height}"
)
print
(
f
"[显示图像] 缩放因子: {self.scale_factor}, 偏移: ({self.offset_x}, {self.offset_y})"
)
def
_updateStatus
(
self
):
def
_updateStatus
(
self
):
"""更新状态显示(已删除状态栏,此方法保留用于兼容性)"""
"""更新状态显示(已删除状态栏,此方法保留用于兼容性)"""
...
@@ -1558,16 +1550,12 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1558,16 +1550,12 @@ class AnnotationWidget(QtWidgets.QWidget):
self
.
annotation_engine
.
bottom_points
.
append
((
image_x
,
image_y
))
self
.
annotation_engine
.
bottom_points
.
append
((
image_x
,
image_y
))
self
.
annotation_engine
.
step
=
2
self
.
annotation_engine
.
step
=
2
self
.
_updateDisplay
()
self
.
_updateDisplay
()
else
:
print
(
"请在检测框内点击设置容器底部点"
)
elif
self
.
annotation_engine
.
step
==
2
:
# 点击顶部模式
elif
self
.
annotation_engine
.
step
==
2
:
# 点击顶部模式
# 检查点击位置是否在最后一个检测框内
# 检查点击位置是否在最后一个检测框内
if
self
.
_isPointInLastBox
(
image_x
,
image_y
):
if
self
.
_isPointInLastBox
(
image_x
,
image_y
):
self
.
annotation_engine
.
top_points
.
append
((
image_x
,
image_y
))
self
.
annotation_engine
.
top_points
.
append
((
image_x
,
image_y
))
self
.
annotation_engine
.
step
=
0
self
.
annotation_engine
.
step
=
0
self
.
_updateDisplay
()
self
.
_updateDisplay
()
else
:
print
(
"请在检测框内点击设置容器顶部点"
)
def
_onMouseMove
(
self
,
event
):
def
_onMouseMove
(
self
,
event
):
"""鼠标移动事件"""
"""鼠标移动事件"""
...
@@ -1748,10 +1736,8 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1748,10 +1736,8 @@ class AnnotationWidget(QtWidgets.QWidget):
if
new_text
and
self
.
editing_area_index
>=
0
:
if
new_text
and
self
.
editing_area_index
>=
0
:
if
self
.
editing_type
==
'name'
:
if
self
.
editing_type
==
'name'
:
self
.
area_names
[
self
.
editing_area_index
]
=
new_text
self
.
area_names
[
self
.
editing_area_index
]
=
new_text
print
(
f
"区域{self.editing_area_index+1}名称已更新: {new_text}"
)
elif
self
.
editing_type
==
'height'
:
elif
self
.
editing_type
==
'height'
:
self
.
area_heights
[
self
.
editing_area_index
]
=
new_text
self
.
area_heights
[
self
.
editing_area_index
]
=
new_text
print
(
f
"区域{self.editing_area_index+1}高度已更新: {new_text}"
)
self
.
_updateDisplay
()
self
.
_updateDisplay
()
...
@@ -1806,9 +1792,6 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1806,9 +1792,6 @@ class AnnotationWidget(QtWidgets.QWidget):
image_x
=
max
(
0
,
min
(
image_x
,
img_width
-
1
))
image_x
=
max
(
0
,
min
(
image_x
,
img_width
-
1
))
image_y
=
max
(
0
,
min
(
image_y
,
img_height
-
1
))
image_y
=
max
(
0
,
min
(
image_y
,
img_height
-
1
))
print
(
f
"[坐标转换] 标签坐标: ({label_x}, {label_y}) -> 图像坐标: ({image_x}, {image_y})"
)
print
(
f
"[坐标转换] 缩放因子: {self.scale_factor}, 偏移: ({self.offset_x}, {self.offset_y})"
)
return
image_x
,
image_y
return
image_x
,
image_y
def
_isPointInLastBox
(
self
,
x
,
y
):
def
_isPointInLastBox
(
self
,
x
,
y
):
...
@@ -1843,7 +1826,6 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1843,7 +1826,6 @@ class AnnotationWidget(QtWidgets.QWidget):
# 画框模式:删除最后一个检测框
# 画框模式:删除最后一个检测框
if
len
(
self
.
annotation_engine
.
boxes
)
>
0
:
if
len
(
self
.
annotation_engine
.
boxes
)
>
0
:
removed_box
=
self
.
annotation_engine
.
boxes
.
pop
()
removed_box
=
self
.
annotation_engine
.
boxes
.
pop
()
print
(
f
"已删除最后一个检测框: {removed_box}"
)
# 同时删除对应的底部点和顶部点
# 同时删除对应的底部点和顶部点
if
len
(
self
.
annotation_engine
.
bottom_points
)
>
0
:
if
len
(
self
.
annotation_engine
.
bottom_points
)
>
0
:
...
@@ -1860,14 +1842,11 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1860,14 +1842,11 @@ class AnnotationWidget(QtWidgets.QWidget):
self
.
area_states
.
pop
()
self
.
area_states
.
pop
()
self
.
_updateDisplay
()
self
.
_updateDisplay
()
else
:
print
(
"没有可删除的检测框"
)
elif
self
.
annotation_engine
.
step
==
1
:
elif
self
.
annotation_engine
.
step
==
1
:
# 标注底部点模式:删除最后一个检测框(回退到画框模式)
# 标注底部点模式:删除最后一个检测框(回退到画框模式)
if
len
(
self
.
annotation_engine
.
boxes
)
>
0
:
if
len
(
self
.
annotation_engine
.
boxes
)
>
0
:
removed_box
=
self
.
annotation_engine
.
boxes
.
pop
()
removed_box
=
self
.
annotation_engine
.
boxes
.
pop
()
print
(
f
"已删除最后一个检测框: {removed_box}"
)
# 同时删除对应的区域名称和高度
# 同时删除对应的区域名称和高度
if
len
(
self
.
area_names
)
>
0
:
if
len
(
self
.
area_names
)
>
0
:
...
@@ -1880,20 +1859,15 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1880,20 +1859,15 @@ class AnnotationWidget(QtWidgets.QWidget):
# 回到画框模式
# 回到画框模式
self
.
annotation_engine
.
step
=
0
self
.
annotation_engine
.
step
=
0
self
.
_updateDisplay
()
self
.
_updateDisplay
()
else
:
print
(
"没有可删除的检测框"
)
elif
self
.
annotation_engine
.
step
==
2
:
elif
self
.
annotation_engine
.
step
==
2
:
# 标注顶部点模式:删除最后一个底部点(回退到标注底部点模式)
# 标注顶部点模式:删除最后一个底部点(回退到标注底部点模式)
if
len
(
self
.
annotation_engine
.
bottom_points
)
>
0
:
if
len
(
self
.
annotation_engine
.
bottom_points
)
>
0
:
removed_point
=
self
.
annotation_engine
.
bottom_points
.
pop
()
removed_point
=
self
.
annotation_engine
.
bottom_points
.
pop
()
print
(
f
"已删除最后一个底部点: {removed_point}"
)
# 回到标注底部点模式
# 回到标注底部点模式
self
.
annotation_engine
.
step
=
1
self
.
annotation_engine
.
step
=
1
self
.
_updateDisplay
()
self
.
_updateDisplay
()
else
:
print
(
"没有可删除的底部点"
)
def
_onReset
(
self
):
def
_onReset
(
self
):
"""重置标注(按R键触发)"""
"""重置标注(按R键触发)"""
...
@@ -1921,43 +1895,33 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1921,43 +1895,33 @@ class AnnotationWidget(QtWidgets.QWidget):
if
event
.
key
()
==
Qt
.
Key_R
:
if
event
.
key
()
==
Qt
.
Key_R
:
# R键:重置所有标注
# R键:重置所有标注
self
.
_onReset
()
self
.
_onReset
()
print
(
"🔄 快捷键 R: 重置所有标注"
)
elif
event
.
key
()
==
Qt
.
Key_C
:
elif
event
.
key
()
==
Qt
.
Key_C
:
# C键:完成标注
# C键:完成标注
self
.
_onComplete
()
self
.
_onComplete
()
print
(
"✅ 快捷键 C: 完成标注"
)
elif
event
.
key
()
==
Qt
.
Key_D
:
elif
event
.
key
()
==
Qt
.
Key_D
:
# D键:删除最后一个标注框(等同于右键)
# D键:删除最后一个标注框(等同于右键)
self
.
_onRightClick
()
self
.
_onRightClick
()
print
(
"快捷键 D: 删除最后一个标注"
)
elif
event
.
key
()
==
Qt
.
Key_U
:
elif
event
.
key
()
==
Qt
.
Key_U
:
# U键:撤销上一步操作(等同于右键)
# U键:撤销上一步操作(等同于右键)
self
.
_onRightClick
()
self
.
_onRightClick
()
print
(
"↩️ 快捷键 U: 撤销上一步操作"
)
elif
event
.
key
()
==
Qt
.
Key_S
:
elif
event
.
key
()
==
Qt
.
Key_S
:
# S键:保存当前标注(完成标注)
# S键:保存当前标注(完成标注)
self
.
_onComplete
()
self
.
_onComplete
()
print
(
"💾 快捷键 S: 保存标注"
)
elif
event
.
key
()
==
Qt
.
Key_H
:
elif
event
.
key
()
==
Qt
.
Key_H
:
# H键:显示/隐藏帮助信息
# H键:显示/隐藏帮助信息
self
.
_toggleHelpDisplay
()
self
.
_toggleHelpDisplay
()
print
(
"❓ 快捷键 H: 切换帮助显示"
)
elif
event
.
key
()
==
Qt
.
Key_1
:
elif
event
.
key
()
==
Qt
.
Key_1
:
# 1键:快速设置区域1高度为20mm
# 1键:快速设置区域1高度为20mm
self
.
_quickSetHeight
(
0
,
"20mm"
)
self
.
_quickSetHeight
(
0
,
"20mm"
)
print
(
"🔢 快捷键 1: 设置区域1高度为20mm"
)
elif
event
.
key
()
==
Qt
.
Key_2
:
elif
event
.
key
()
==
Qt
.
Key_2
:
# 2键:快速设置区域2高度为20mm
# 2键:快速设置区域2高度为20mm
self
.
_quickSetHeight
(
1
,
"20mm"
)
self
.
_quickSetHeight
(
1
,
"20mm"
)
print
(
"🔣 快捷键 2: 设置区域2高度为20mm"
)
elif
event
.
key
()
==
Qt
.
Key_3
:
elif
event
.
key
()
==
Qt
.
Key_3
:
# 3键:快速设置区域3高度为20mm
# 3键:快速设置区域3高度为20mm
self
.
_quickSetHeight
(
2
,
"20mm"
)
self
.
_quickSetHeight
(
2
,
"20mm"
)
print
(
"🔤 快捷键 3: 设置区域3高度为20mm"
)
elif
event
.
key
()
==
Qt
.
Key_Escape
:
elif
event
.
key
()
==
Qt
.
Key_Escape
:
# ESC键:关闭窗口
# ESC键:关闭窗口
self
.
close
()
self
.
close
()
print
(
"❌ 快捷键 ESC: 关闭标注窗口"
)
else
:
else
:
super
()
.
keyPressEvent
(
event
)
super
()
.
keyPressEvent
(
event
)
...
@@ -1992,32 +1956,26 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -1992,32 +1956,26 @@ class AnnotationWidget(QtWidgets.QWidget):
# 删除检测框
# 删除检测框
removed_box
=
self
.
annotation_engine
.
boxes
.
pop
(
area_index
)
removed_box
=
self
.
annotation_engine
.
boxes
.
pop
(
area_index
)
print
(
f
"已删除检测框 {area_index+1}: {removed_box}"
)
# 删除对应的底部点
# 删除对应的底部点
if
area_index
<
len
(
self
.
annotation_engine
.
bottom_points
):
if
area_index
<
len
(
self
.
annotation_engine
.
bottom_points
):
removed_bottom
=
self
.
annotation_engine
.
bottom_points
.
pop
(
area_index
)
removed_bottom
=
self
.
annotation_engine
.
bottom_points
.
pop
(
area_index
)
print
(
f
"已删除底部点 {area_index+1}: {removed_bottom}"
)
# 删除对应的顶部点
# 删除对应的顶部点
if
area_index
<
len
(
self
.
annotation_engine
.
top_points
):
if
area_index
<
len
(
self
.
annotation_engine
.
top_points
):
removed_top
=
self
.
annotation_engine
.
top_points
.
pop
(
area_index
)
removed_top
=
self
.
annotation_engine
.
top_points
.
pop
(
area_index
)
print
(
f
"已删除顶部点 {area_index+1}: {removed_top}"
)
# 删除对应的区域名称
# 删除对应的区域名称
if
area_index
<
len
(
self
.
area_names
):
if
area_index
<
len
(
self
.
area_names
):
removed_name
=
self
.
area_names
.
pop
(
area_index
)
removed_name
=
self
.
area_names
.
pop
(
area_index
)
print
(
f
"已删除区域名称 {area_index+1}: {removed_name}"
)
# 删除对应的区域高度
# 删除对应的区域高度
if
area_index
<
len
(
self
.
area_heights
):
if
area_index
<
len
(
self
.
area_heights
):
removed_height
=
self
.
area_heights
.
pop
(
area_index
)
removed_height
=
self
.
area_heights
.
pop
(
area_index
)
print
(
f
"已删除区域高度 {area_index+1}: {removed_height}"
)
# 删除对应的区域状态
# 删除对应的区域状态
if
area_index
<
len
(
self
.
area_states
):
if
area_index
<
len
(
self
.
area_states
):
removed_state
=
self
.
area_states
.
pop
(
area_index
)
removed_state
=
self
.
area_states
.
pop
(
area_index
)
print
(
f
"已删除区域状态 {area_index+1}: {removed_state}"
)
# 更新显示
# 更新显示
self
.
_updateDisplay
()
self
.
_updateDisplay
()
...
@@ -2038,10 +1996,7 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -2038,10 +1996,7 @@ class AnnotationWidget(QtWidgets.QWidget):
self
.
_help_visible
=
not
self
.
_help_visible
self
.
_help_visible
=
not
self
.
_help_visible
if
self
.
_help_visible
:
pass
print
(
"帮助信息已显示"
)
else
:
print
(
"帮助信息已隐藏"
)
# 更新显示
# 更新显示
self
.
_updateDisplay
()
self
.
_updateDisplay
()
...
@@ -2049,7 +2004,6 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -2049,7 +2004,6 @@ class AnnotationWidget(QtWidgets.QWidget):
def
_quickSetHeight
(
self
,
area_index
,
height_value
):
def
_quickSetHeight
(
self
,
area_index
,
height_value
):
"""快速设置指定区域的高度"""
"""快速设置指定区域的高度"""
if
area_index
<
0
or
area_index
>=
len
(
self
.
annotation_engine
.
boxes
):
if
area_index
<
0
or
area_index
>=
len
(
self
.
annotation_engine
.
boxes
):
print
(
f
"区域 {area_index+1} 不存在,无法设置高度"
)
return
return
# 确保区域配置存在
# 确保区域配置存在
...
@@ -2059,8 +2013,6 @@ class AnnotationWidget(QtWidgets.QWidget):
...
@@ -2059,8 +2013,6 @@ class AnnotationWidget(QtWidgets.QWidget):
old_height
=
self
.
area_heights
[
area_index
]
old_height
=
self
.
area_heights
[
area_index
]
self
.
area_heights
[
area_index
]
=
height_value
self
.
area_heights
[
area_index
]
=
height_value
print
(
f
"区域 {area_index+1} 高度已更新: {old_height} → {height_value}"
)
# 更新显示
# 更新显示
self
.
_updateDisplay
()
self
.
_updateDisplay
()
...
...
widgets/videopage/historyvideopanel.py
View file @
a4f905c9
...
@@ -12,7 +12,6 @@ try:
...
@@ -12,7 +12,6 @@ try:
from
qtpy.QtCore
import
QUrl
from
qtpy.QtCore
import
QUrl
MULTIMEDIA_AVAILABLE
=
True
MULTIMEDIA_AVAILABLE
=
True
except
ImportError
:
except
ImportError
:
print
(
"⚠️ [HistoryVideoPanel] QtMultimedia 不可用,将使用 QLabel 作为后备"
)
MULTIMEDIA_AVAILABLE
=
False
MULTIMEDIA_AVAILABLE
=
False
QMediaPlayer
=
None
QMediaPlayer
=
None
QMediaContent
=
None
QMediaContent
=
None
...
@@ -107,7 +106,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -107,7 +106,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
# 使用 videoWidget 作为视频显示区域
# 使用 videoWidget 作为视频显示区域
self
.
videoLabel
=
self
.
videoWidget
self
.
videoLabel
=
self
.
videoWidget
print
(
"✅ [HistoryVideoPanel] 使用 QVideoWidget 显示视频"
)
else
:
else
:
# 后备方案:使用 QLabel
# 后备方案:使用 QLabel
self
.
videoLabel
=
QtWidgets
.
QLabel
()
self
.
videoLabel
=
QtWidgets
.
QLabel
()
...
@@ -129,7 +127,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -129,7 +127,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
"""
)
"""
)
self
.
mediaPlayer
=
None
self
.
mediaPlayer
=
None
print
(
"⚠️ [HistoryVideoPanel] 使用 QLabel 作为后备显示"
)
# 🔥 历史视频面板不显示通道名称标签
# 🔥 历史视频面板不显示通道名称标签
# 创建名称显示标签(隐藏,保留用于兼容性)
# 创建名称显示标签(隐藏,保留用于兼容性)
...
@@ -497,7 +494,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -497,7 +494,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
def
_onPlayPauseClicked
(
self
):
def
_onPlayPauseClicked
(
self
):
"""播放/暂停按钮点击"""
"""播放/暂停按钮点击"""
if
not
self
.
mediaPlayer
:
if
not
self
.
mediaPlayer
:
print
(
f
"⚠️ [HistoryVideoPanel] 媒体播放器不可用"
)
return
return
# 🔥 检查是否已加载视频
# 🔥 检查是否已加载视频
...
@@ -505,24 +501,19 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -505,24 +501,19 @@ class HistoryVideoPanel(QtWidgets.QWidget):
# 没有加载视频,尝试从 curvemission 加载
# 没有加载视频,尝试从 curvemission 加载
task_name
=
self
.
_getCurrentMissionFromParent
()
task_name
=
self
.
_getCurrentMissionFromParent
()
if
task_name
:
if
task_name
:
print
(
f
"📹 [HistoryVideoPanel] 未加载视频,尝试从任务加载: {task_name}"
)
success
=
self
.
loadVideoFromTask
(
task_name
)
success
=
self
.
loadVideoFromTask
(
task_name
)
if
not
success
:
if
not
success
:
print
(
f
"❌ [HistoryVideoPanel] 无法加载视频,任务: {task_name}"
)
return
return
else
:
else
:
print
(
f
"⚠️ [HistoryVideoPanel] 未设置任务,无法加载视频"
)
return
return
# 根据当前播放状态切换
# 根据当前播放状态切换
if
self
.
mediaPlayer
.
state
()
==
QMediaPlayer
.
PlayingState
:
if
self
.
mediaPlayer
.
state
()
==
QMediaPlayer
.
PlayingState
:
# 当前正在播放,暂停
# 当前正在播放,暂停
self
.
mediaPlayer
.
pause
()
self
.
mediaPlayer
.
pause
()
print
(
f
"⏸️ [HistoryVideoPanel] 暂停播放"
)
else
:
else
:
# 当前暂停或停止,开始播放
# 当前暂停或停止,开始播放
self
.
mediaPlayer
.
play
()
self
.
mediaPlayer
.
play
()
print
(
f
"▶️ [HistoryVideoPanel] 开始播放"
)
def
_onMediaStateChanged
(
self
,
state
):
def
_onMediaStateChanged
(
self
,
state
):
"""媒体播放器状态改变"""
"""媒体播放器状态改变"""
...
@@ -564,17 +555,15 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -564,17 +555,15 @@ class HistoryVideoPanel(QtWidgets.QWidget):
if
duration
>
0
:
if
duration
>
0
:
total_seconds
=
duration
//
1000
total_seconds
=
duration
//
1000
total_time
=
f
"{total_seconds // 60:02d}:{total_seconds
% 60
:02d}"
total_time
=
f
"{total_seconds // 60:02d}:{total_seconds
% 60
:02d}"
print
(
f
"📹 [HistoryVideoPanel] 视频总时长: {total_time}"
)
def
_onMediaError
(
self
,
error
):
def
_onMediaError
(
self
,
error
):
"""媒体播放错误"""
"""媒体播放错误"""
if
self
.
mediaPlayer
:
if
self
.
mediaPlayer
:
error_string
=
self
.
mediaPlayer
.
errorString
()
error_string
=
self
.
mediaPlayer
.
errorString
()
print
(
f
"❌ [HistoryVideoPanel] 播放错误: {error_string}"
)
def
_onProgressSliderPressed
(
self
):
def
_onProgressSliderPressed
(
self
):
"""进度条按下"""
"""进度条按下"""
p
rint
(
f
"[HistoryVideoPanel] 进度条被按下"
)
p
ass
def
_onProgressSliderReleased
(
self
):
def
_onProgressSliderReleased
(
self
):
"""进度条释放"""
"""进度条释放"""
...
@@ -588,7 +577,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -588,7 +577,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
# 计算目标位置(毫秒)
# 计算目标位置(毫秒)
position
=
int
(
duration
*
value
/
100
)
position
=
int
(
duration
*
value
/
100
)
self
.
mediaPlayer
.
setPosition
(
position
)
self
.
mediaPlayer
.
setPosition
(
position
)
print
(
f
"⏩ [HistoryVideoPanel] 跳转到: {value}
%
(位置: {position}ms)"
)
def
_onProgressValueChanged
(
self
,
value
):
def
_onProgressValueChanged
(
self
,
value
):
"""进度条值改变(用户拖动时)"""
"""进度条值改变(用户拖动时)"""
...
@@ -643,12 +631,10 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -643,12 +631,10 @@ class HistoryVideoPanel(QtWidgets.QWidget):
video_path: 视频文件路径
video_path: 视频文件路径
"""
"""
if
not
self
.
mediaPlayer
:
if
not
self
.
mediaPlayer
:
print
(
f
"⚠️ [HistoryVideoPanel] 媒体播放器不可用,无法加载视频"
)
return
False
return
False
import
os
import
os
if
not
os
.
path
.
exists
(
video_path
):
if
not
os
.
path
.
exists
(
video_path
):
print
(
f
"❌ [HistoryVideoPanel] 视频文件不存在: {video_path}"
)
return
False
return
False
# 设置媒体内容
# 设置媒体内容
...
@@ -656,7 +642,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -656,7 +642,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
media_content
=
QMediaContent
(
media_url
)
media_content
=
QMediaContent
(
media_url
)
self
.
mediaPlayer
.
setMedia
(
media_content
)
self
.
mediaPlayer
.
setMedia
(
media_content
)
print
(
f
"📹 [HistoryVideoPanel] 已加载视频: {video_path}"
)
return
True
return
True
def
loadVideoFromTask
(
self
,
task_folder_name
):
def
loadVideoFromTask
(
self
,
task_folder_name
):
...
@@ -667,7 +652,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -667,7 +652,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
task_folder_name: 任务文件夹名称(如 "1_2")
task_folder_name: 任务文件夹名称(如 "1_2")
"""
"""
if
not
task_folder_name
or
task_folder_name
==
"None"
:
if
not
task_folder_name
or
task_folder_name
==
"None"
:
print
(
f
"⚠️ [HistoryVideoPanel] 无效的任务名称: {task_folder_name}"
)
return
False
return
False
import
os
import
os
...
@@ -687,7 +671,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -687,7 +671,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
task_folder
=
os
.
path
.
join
(
project_root
,
'database'
,
'mission_result'
,
task_folder_name
)
task_folder
=
os
.
path
.
join
(
project_root
,
'database'
,
'mission_result'
,
task_folder_name
)
if
not
os
.
path
.
exists
(
task_folder
):
if
not
os
.
path
.
exists
(
task_folder
):
print
(
f
"❌ [HistoryVideoPanel] 任务文件夹不存在: {task_folder}"
)
return
False
return
False
# 查找视频文件(支持常见格式)
# 查找视频文件(支持常见格式)
...
@@ -700,7 +683,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -700,7 +683,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
video_files
.
append
(
os
.
path
.
join
(
task_folder
,
file
))
video_files
.
append
(
os
.
path
.
join
(
task_folder
,
file
))
if
not
video_files
:
if
not
video_files
:
print
(
f
"⚠️ [HistoryVideoPanel] 任务文件夹中没有找到视频文件: {task_folder}"
)
return
False
return
False
# 加载第一个视频文件
# 加载第一个视频文件
...
@@ -727,12 +709,10 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -727,12 +709,10 @@ class HistoryVideoPanel(QtWidgets.QWidget):
"""
"""
if
task_folder_name
and
task_folder_name
!=
"None"
:
if
task_folder_name
and
task_folder_name
!=
"None"
:
self
.
taskLabel
.
setText
(
task_folder_name
)
self
.
taskLabel
.
setText
(
task_folder_name
)
print
(
f
"[HistoryVideoPanel.setTaskInfo] 显示任务信息: {task_folder_name}"
)
# 任务分配后启用面板
# 任务分配后启用面板
self
.
_setDisabled
(
False
)
self
.
_setDisabled
(
False
)
else
:
else
:
self
.
taskLabel
.
setText
(
"历史数据"
)
self
.
taskLabel
.
setText
(
"历史数据"
)
print
(
f
"[HistoryVideoPanel.setTaskInfo] 任务为空,显示'历史数据'"
)
# 清空任务时禁用面板
# 清空任务时禁用面板
self
.
_setDisabled
(
True
)
self
.
_setDisabled
(
True
)
...
@@ -743,7 +723,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -743,7 +723,6 @@ class HistoryVideoPanel(QtWidgets.QWidget):
def
clearTaskInfo
(
self
):
def
clearTaskInfo
(
self
):
"""清空任务信息显示"""
"""清空任务信息显示"""
self
.
taskLabel
.
setText
(
"历史数据"
)
self
.
taskLabel
.
setText
(
"历史数据"
)
print
(
f
"ℹ️ [HistoryVideoPanel.clearTaskInfo] 清空任务信息,显示'历史数据'"
)
# 清空任务时禁用面板
# 清空任务时禁用面板
self
.
_setDisabled
(
True
)
self
.
_setDisabled
(
True
)
self
.
taskLabel
.
adjustSize
()
self
.
taskLabel
.
adjustSize
()
...
@@ -761,16 +740,12 @@ class HistoryVideoPanel(QtWidgets.QWidget):
...
@@ -761,16 +740,12 @@ class HistoryVideoPanel(QtWidgets.QWidget):
if
self
.
_main_window
and
hasattr
(
self
.
_main_window
,
'curvemission'
):
if
self
.
_main_window
and
hasattr
(
self
.
_main_window
,
'curvemission'
):
mission_name
=
self
.
_main_window
.
curvemission
.
currentText
()
mission_name
=
self
.
_main_window
.
curvemission
.
currentText
()
if
mission_name
and
mission_name
!=
"请选择任务"
:
if
mission_name
and
mission_name
!=
"请选择任务"
:
print
(
f
"🔍 [HistoryVideoPanel] 从 curvemission 获取任务: {mission_name}"
)
return
mission_name
return
mission_name
else
:
else
:
print
(
f
"⚠️ [HistoryVideoPanel] curvemission 未选择任务"
)
return
None
return
None
print
(
f
"⚠️ [HistoryVideoPanel] 未设置主窗口引用"
)
return
None
return
None
except
Exception
as
e
:
except
Exception
as
e
:
print
(
f
"❌ [HistoryVideoPanel] 获取任务名称失败: {e}"
)
return
None
return
None
def
_setDisabled
(
self
,
disabled
):
def
_setDisabled
(
self
,
disabled
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment