feat: 优化相机显示区域

This commit is contained in:
zhu-mengmeng 2025-06-30 18:40:50 +08:00
parent 7da216ec58
commit 336ba26bc8
3 changed files with 65 additions and 13 deletions

View File

@ -210,7 +210,7 @@ class MainWindowUI(QMainWindow):
self.material_frame = QFrame() self.material_frame = QFrame()
self.material_frame.setFrameShape(QFrame.StyledPanel) self.material_frame.setFrameShape(QFrame.StyledPanel)
self.material_frame.setLineWidth(1) self.material_frame.setLineWidth(1)
self.material_frame.setFixedHeight(380) # 增加高度以匹配图片 self.material_frame.setFixedHeight(380) # 恢复原始高度
self.material_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.material_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }")
self.material_layout = QHBoxLayout(self.material_frame) self.material_layout = QHBoxLayout(self.material_frame)
self.material_layout.setContentsMargins(0, 0, 0, 0) self.material_layout.setContentsMargins(0, 0, 0, 0)
@ -234,13 +234,15 @@ class MainWindowUI(QMainWindow):
self.left_layout.addWidget(self.material_frame) self.left_layout.addWidget(self.material_frame)
# 托盘号 - 使用QFrame包裹添加边框 # 托盘号区域 - 使用QFrame包裹添加边框
self.tray_frame = QFrame() self.tray_frame = QFrame()
self.tray_frame.setFrameShape(QFrame.StyledPanel) self.tray_frame.setFrameShape(QFrame.StyledPanel)
self.tray_frame.setLineWidth(1) self.tray_frame.setLineWidth(1)
self.tray_frame.setFixedHeight(40) # 进一步减小高度,刚好容纳控件
self.tray_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }")
self.tray_layout = QHBoxLayout(self.tray_frame) self.tray_layout = QHBoxLayout(self.tray_frame)
self.tray_layout.setContentsMargins(0, 0, 0, 0) self.tray_layout.setContentsMargins(0, 0, 0, 0) # 移除所有边距
self.tray_layout.setSpacing(0) self.tray_layout.setSpacing(0) # 移除所有间距
self.tray_label = QLabel("托盘号") self.tray_label = QLabel("托盘号")
self.tray_label.setFont(self.normal_font) self.tray_label.setFont(self.normal_font)
@ -250,7 +252,8 @@ class MainWindowUI(QMainWindow):
self.tray_layout.addWidget(self.tray_label) self.tray_layout.addWidget(self.tray_label)
self.tray_edit = QComboBox() self.tray_edit = QComboBox()
self.tray_edit.setStyleSheet("border: none; padding: 5px 10px;") self.tray_edit.setFixedHeight(40) # 设置固定高度与父容器相同
self.tray_edit.setStyleSheet("QComboBox { border: none; padding: 0px 10px; background-color: white; } QComboBox::drop-down { border: none; width: 20px; }")
self.tray_edit.setFont(QFont("微软雅黑", 12)) self.tray_edit.setFont(QFont("微软雅黑", 12))
self.tray_edit.setEditable(True) # 允许手动输入 self.tray_edit.setEditable(True) # 允许手动输入
self.tray_edit.setInsertPolicy(QComboBox.NoInsert) # 不自动插入用户输入到列表中 self.tray_edit.setInsertPolicy(QComboBox.NoInsert) # 不自动插入用户输入到列表中
@ -268,7 +271,7 @@ class MainWindowUI(QMainWindow):
self.output_frame = QFrame() self.output_frame = QFrame()
self.output_frame.setFrameShape(QFrame.StyledPanel) self.output_frame.setFrameShape(QFrame.StyledPanel)
self.output_frame.setLineWidth(1) self.output_frame.setLineWidth(1)
self.output_frame.setFixedHeight(150) # 增加高度以匹配图片 self.output_frame.setFixedHeight(100) # 缩小下料区高度
self.output_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.output_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }")
self.output_layout = QHBoxLayout(self.output_frame) self.output_layout = QHBoxLayout(self.output_frame)
self.output_layout.setContentsMargins(0, 0, 0, 0) self.output_layout.setContentsMargins(0, 0, 0, 0)
@ -286,7 +289,7 @@ class MainWindowUI(QMainWindow):
self.output_content = QWidget() self.output_content = QWidget()
self.output_content.setStyleSheet("background-color: white;") self.output_content.setStyleSheet("background-color: white;")
self.output_content_layout = QVBoxLayout(self.output_content) self.output_content_layout = QVBoxLayout(self.output_content)
self.output_content_layout.setContentsMargins(10, 10, 10, 10) self.output_content_layout.setContentsMargins(5, 5, 5, 5) # 减小内部边距
self.output_layout.addWidget(self.output_content) self.output_layout.addWidget(self.output_content)
self.left_layout.addWidget(self.output_frame) self.left_layout.addWidget(self.output_frame)

View File

@ -6,10 +6,12 @@ from ctypes import *
# 确定使用哪个UI框架 # 确定使用哪个UI框架
try: try:
from PySide6.QtWidgets import QWidget, QVBoxLayout, QFrame from PySide6.QtWidgets import QWidget, QVBoxLayout, QFrame
from PySide6.QtCore import Qt, Signal from PySide6.QtCore import Qt, Signal, QSize
from PySide6.QtGui import QPalette, QColor
except ImportError: except ImportError:
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QFrame from PyQt5.QtWidgets import QWidget, QVBoxLayout, QFrame
from PyQt5.QtCore import Qt, pyqtSignal as Signal from PyQt5.QtCore import Qt, pyqtSignal as Signal, QSize
from PyQt5.QtGui import QPalette, QColor
# 添加相机模块路径 # 添加相机模块路径
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(__file__)), "camera")) sys.path.append(os.path.join(os.path.dirname(os.path.dirname(__file__)), "camera"))
@ -44,6 +46,12 @@ class CameraDisplayWidget(QWidget):
# 设置大小变化事件处理 # 设置大小变化事件处理
self.resizeEvent = self.on_resize_event self.resizeEvent = self.on_resize_event
# 设置固定尺寸策略,防止超出父容器
self.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
# 设置最小尺寸
self.setMinimumSize(QSize(320, 240))
def init_ui(self): def init_ui(self):
"""初始化UI - 只包含相机显示框架""" """初始化UI - 只包含相机显示框架"""
@ -59,6 +67,8 @@ class CameraDisplayWidget(QWidget):
self.frame.setFrameShape(QFrame.NoFrame) self.frame.setFrameShape(QFrame.NoFrame)
# 设置黑色背景 # 设置黑色背景
self.frame.setStyleSheet("background-color: #000000;") self.frame.setStyleSheet("background-color: #000000;")
# 设置框架的尺寸策略
self.frame.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
# 添加到布局 # 添加到布局
layout.addWidget(self.frame) layout.addWidget(self.frame)
@ -89,7 +99,7 @@ class CameraDisplayWidget(QWidget):
success = self.camera_manager.start_grabbing(window_id) success = self.camera_manager.start_grabbing(window_id)
if success: if success:
logging.info("相机画面显示开始") logging.info(f"相机画面显示开始,显示区域大小: {self.frame.width()}x{self.frame.height()}")
self.signal_camera_status.emit(True, "") self.signal_camera_status.emit(True, "")
else: else:
logging.error("开始显示相机画面失败") logging.error("开始显示相机画面失败")
@ -125,6 +135,11 @@ class CameraDisplayWidget(QWidget):
def on_resize_event(self, event): def on_resize_event(self, event):
"""处理大小变化事件,确保相机画面适配上料区""" """处理大小变化事件,确保相机画面适配上料区"""
super().resizeEvent(event) super().resizeEvent(event)
# 记录大小变化
logging.debug(f"相机显示区域大小变化为: {self.width()}x{self.height()}")
# 当尺寸变化超过一定阈值时,重新调整相机显示
if self.camera_manager.isGrabbing: if self.camera_manager.isGrabbing:
# 停止当前显示 # 停止当前显示
self.stop_display() self.stop_display()

View File

@ -2872,6 +2872,7 @@ class MainWindow(MainWindowUI):
"""初始化相机显示区域""" """初始化相机显示区域"""
try: try:
logging.info(f"开始初始化相机显示区域配置中camera_enabled={self.camera_enabled}") logging.info(f"开始初始化相机显示区域配置中camera_enabled={self.camera_enabled}")
logging.info(f"上料区域大小: {self.material_content.width()}x{self.material_content.height()}")
# 检查相机管理器状态,以确定相机是否实际已打开 # 检查相机管理器状态,以确定相机是否实际已打开
from widgets.camera_manager import CameraManager from widgets.camera_manager import CameraManager
@ -2912,11 +2913,14 @@ class MainWindow(MainWindowUI):
self.material_placeholder = QLabel("相机初始化中..." if should_enable_camera else "相机功能已禁用") self.material_placeholder = QLabel("相机初始化中..." if should_enable_camera else "相机功能已禁用")
self.material_placeholder.setAlignment(Qt.AlignCenter) self.material_placeholder.setAlignment(Qt.AlignCenter)
self.material_placeholder.setStyleSheet("color: #888888; background-color: #f0f0f0;") self.material_placeholder.setStyleSheet("color: #888888; background-color: #f0f0f0;")
self.material_placeholder.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
self.material_content_layout.addWidget(self.material_placeholder) self.material_content_layout.addWidget(self.material_placeholder)
self.material_placeholder.show() self.material_placeholder.show()
# 创建相机显示组件 # 创建相机显示组件
self.camera_display = CameraDisplayWidget() self.camera_display = CameraDisplayWidget()
# 设置合适的尺寸策略,使相机显示能够正确适应上料区域
self.camera_display.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
# 显式连接相机状态信号 # 显式连接相机状态信号
try: try:
@ -2992,15 +2996,23 @@ class MainWindow(MainWindowUI):
"""开始显示相机画面(内部方法)""" """开始显示相机画面(内部方法)"""
try: try:
if self.camera_display and self.camera_enabled: if self.camera_display and self.camera_enabled:
logging.info(f"开始相机显示,上料区域大小: {self.material_content.width()}x{self.material_content.height()}")
# 先从布局中移除占位符 # 先从布局中移除占位符
if self.material_placeholder: if self.material_placeholder:
self.material_content_layout.removeWidget(self.material_placeholder) self.material_content_layout.removeWidget(self.material_placeholder)
self.material_placeholder.hide() self.material_placeholder.hide()
# 添加相机显示组件并确保其可见 # 添加相机显示组件并确保其可见
# 确保相机显示组件的布局策略正确
self.camera_display.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
self.material_content_layout.addWidget(self.camera_display) self.material_content_layout.addWidget(self.camera_display)
self.camera_display.show() self.camera_display.show()
# 强制布局更新
self.material_content_layout.update()
self.material_content.updateGeometry()
# 开始显示 # 开始显示
success = self.camera_display.start_display() success = self.camera_display.start_display()
@ -3015,9 +3027,13 @@ class MainWindow(MainWindowUI):
self.material_placeholder.show() self.material_placeholder.show()
logging.error("相机显示启动失败") logging.error("相机显示启动失败")
else: else:
logging.info("相机显示已成功启动") logging.info(f"相机显示已成功启动,显示区域大小: {self.camera_display.width()}x{self.camera_display.height()}")
except Exception as e: except Exception as e:
logging.error(f"启动相机显示失败: {str(e)}") logging.error(f"启动相机显示失败: {str(e)}")
if self.material_placeholder:
self.material_placeholder.setText(f"相机显示错误: {str(e)}")
self.material_content_layout.addWidget(self.material_placeholder)
self.material_placeholder.show()
def update_camera_ui(self, is_camera_ready): def update_camera_ui(self, is_camera_ready):
"""更新相机UI显示 """更新相机UI显示
@ -3033,11 +3049,20 @@ class MainWindow(MainWindowUI):
self.material_placeholder.hide() self.material_placeholder.hide()
if self.camera_display: if self.camera_display:
# 确保相机显示组件的布局策略正确
self.camera_display.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
# 确保相机显示组件已添加到布局 # 确保相机显示组件已添加到布局
if self.camera_display.parent() is None: if self.camera_display.parent() is None:
self.material_content_layout.addWidget(self.camera_display) self.material_content_layout.addWidget(self.camera_display)
self.camera_display.show() self.camera_display.show()
logging.info("相机UI已更新显示相机画面")
# 强制布局更新
self.material_content_layout.update()
self.material_content.updateGeometry()
logging.info(f"相机UI已更新显示相机画面尺寸: {self.camera_display.width()}x{self.camera_display.height()}")
else: else:
# 隐藏相机画面,显示占位符 # 隐藏相机画面,显示占位符
if self.camera_display: if self.camera_display:
@ -3045,16 +3070,25 @@ class MainWindow(MainWindowUI):
self.camera_display.hide() self.camera_display.hide()
if self.material_placeholder: if self.material_placeholder:
# 确保占位符布局策略正确
self.material_placeholder.setSizePolicy(QWidget.sizePolicy().Expanding, QWidget.sizePolicy().Expanding)
# 确保占位符已添加到布局 # 确保占位符已添加到布局
if self.material_placeholder.parent() is None: if self.material_placeholder.parent() is None:
self.material_content_layout.addWidget(self.material_placeholder) self.material_content_layout.addWidget(self.material_placeholder)
self.material_placeholder.show() self.material_placeholder.show()
# 强制布局更新
self.material_content_layout.update()
self.material_content.updateGeometry()
if not self.camera_enabled: if not self.camera_enabled:
self.material_placeholder.setText("相机功能已禁用") self.material_placeholder.setText("相机功能已禁用")
elif not is_camera_ready: elif not is_camera_ready:
self.material_placeholder.setText("相机未就绪") self.material_placeholder.setText("相机未就绪")
logging.info(f"相机UI已更新显示占位符 (相机启用={self.camera_enabled}, 相机就绪={is_camera_ready})")
logging.info(f"相机UI已更新显示占位符 (相机启用={self.camera_enabled}, 相机就绪={is_camera_ready})")
except Exception as e: except Exception as e:
logging.error(f"更新相机UI失败: {str(e)}") logging.error(f"更新相机UI失败: {str(e)}")