Commit a4f905c9 by Yuhaibo

1

parent bd3dd6ab
...@@ -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语句
### 部分清理 ### 部分清理
14. 🔄 **handlers/videopage/missionpanel_handler.py** - 已清理前330行,删除约20处print语句(文件共2050行,需继续清理) 17. 🔄 **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
### 剩余工作量估算 ### 剩余工作量估算
- 已清理: 约234处调试语句 (13个文件完全清理 + 1个文件部分清理) - 已清理: 约283处调试语句 (16个文件完全清理 + 1个文件部分清理)
- 剩余: 约3207处调试语句 - 剩余: 约3158处调试语句
- 预计需要: 继续手动清理约50个文件 - 预计需要: 继续手动清理约47个文件
### 本次清理总结 (2025-11-26 20:20) ### 本次清理总结 (2025-11-26 20:30)
- 完成文件数: 13个完全清理 + 1个部分清理 - 完成文件数: 16个完全清理 + 1个部分清理
- 删除调试语句: 约234 - 删除调试语句: 约283
- 主要清理内容: - 主要清理内容:
- 核心应用入口和窗口管理 (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 (missionpanel.py) - 完整UI组件系统 (missionpanel.py, general_set.py, curvepanel.py, historyvideopanel.py)
- 部分任务面板Handler (missionpanel_handler.py) - 部分任务面板Handler (missionpanel_handler.py)
--- ---
*最后更新: 2025-11-26 20:20* *最后更新: 2025-11-26 20:30*
...@@ -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:
# 提取配置 # 提取配置
......
...@@ -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
) )
# 应用全局进度条样式管理器到进度对话框中的进度条 # 应用全局进度条样式管理器到进度对话框中的进度条
......
...@@ -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()
......
...@@ -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()
......
...@@ -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
......
...@@ -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):
""" """
......
...@@ -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()
......
...@@ -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):
"""进度条按下""" """进度条按下"""
print(f"[HistoryVideoPanel] 进度条被按下") pass
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):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment