GrabBag/GrabBagApp/devstatus.cpp

192 lines
5.8 KiB
C++
Raw Normal View History

2025-06-19 01:38:50 +08:00
#include "devstatus.h"
#include "ui_devstatus.h"
#include <QPainter>
#include <QBrush>
#include "VrLog.h"
devstatus::devstatus(QWidget *parent)
: QWidget(parent)
, ui(new Ui::devstatus)
{
ui->setupUi(this);
// 强制应用样式表 - 这是关键!
this->setAttribute(Qt::WA_StyledBackground, true);
// 初始化时设置样式
setItemStyle();
// 初始化设备状态(离线状态)
updateCamera1Status(false);
updateCamera2Status(false);
updateRobotStatus(false);
}
devstatus::~devstatus()
{
delete ui;
}
// 设置devstatus的样式
void devstatus::setItemStyle()
{
this->setStyleSheet(
"devstatus { "
" border: 2px solid #191A1C; " // 添加边框作为格子间分隔线
" border-radius: 0px; " // 去掉圆角,让分隔线更清晰
"} "
);
}
// 设置相机状态图片的私有成员函数
void devstatus::setCameraStatusImage(QWidget* widget, bool isOnline) {
if (!widget) return;
QString imagePath = isOnline ? ":/resource/camera_online.png" : ":/resource/camera_offline.png";
widget->setStyleSheet(QString("image: url(%1);").arg(imagePath));
// widget->setFixedSize(32, 32); // 调整大小以适应图片
2025-06-19 01:38:50 +08:00
}
// 设置机械臂状态图片的私有成员函数
void devstatus::setRobotStatusImage(QWidget* widget, bool isOnline) {
if (!widget) return;
QString imagePath = isOnline ? ":/resource/robot_online.png" : ":/resource/robot_offline.png";
widget->setStyleSheet(QString("image: url(%1); ").arg(imagePath));
// widget->setFixedSize(32, 32); // 调整大小以适应图片
2025-06-19 01:38:50 +08:00
}
// 更新相机1状态
void devstatus::updateCamera1Status(bool isConnected)
{
setCameraStatusImage(ui->dev_camer_1_img, isConnected);
QString statusText = isConnected ? "相机1在线" : "相机1离线";
QString colorStyle = isConnected ? "color: rgb(140, 180, 60);" : "color: rgb(220, 60, 60);";
ui->dev_camera_1_txt->setText(statusText);
ui->dev_camera_1_txt->setStyleSheet(colorStyle);
}
// 更新相机2状态
void devstatus::updateCamera2Status(bool isConnected)
{
setCameraStatusImage(ui->dev_camer_2_img, isConnected);
QString statusText = isConnected ? "相机2在线" : "相机2离线";
QString colorStyle = isConnected ? "color: rgb(140, 180, 60);" : "color: rgb(220, 60, 60);";
ui->dev_camera_2_txt->setText(statusText);
ui->dev_camera_2_txt->setStyleSheet(colorStyle);
}
// 更新机械臂状态
void devstatus::updateRobotStatus(bool isConnected)
{
setRobotStatusImage(ui->dev_robot_img, isConnected);
QString statusText = isConnected ? "机械臂在线" : "机械臂离线";
QString colorStyle = isConnected ? "color: rgb(140, 180, 60);" : "color: rgb(220, 60, 60);";
ui->dev_robot_txt->setText(statusText);
ui->dev_robot_txt->setStyleSheet(colorStyle);
}
// 设置相机数量(用于控制相机二的显示和布局方向)
2025-06-19 01:38:50 +08:00
void devstatus::setCameraCount(int cameraCount)
{
// 如果相机数量小于2隐藏相机二相关的UI元素
bool showCamera2 = (cameraCount >= 2);
LOG_DEBUG("setCameraCount: %d \n", cameraCount);
2025-06-19 01:38:50 +08:00
// 隐藏整个相机2的frame而不是单独隐藏图片和文字
if (ui->frame_camera_2) {
ui->frame_camera_2->setVisible(showCamera2);
} else {
// 如果frame_camera_2不存在则单独隐藏图片和文字控件
ui->dev_camer_2_img->setVisible(showCamera2);
ui->dev_camera_2_txt->setVisible(showCamera2);
}
// 根据相机数量选择布局方式
if (cameraCount >= 2) {
// 多相机:纵向排列
setVerticalLayout();
} else {
// 单相机:横向排列,相机和机械臂各占一半
setHorizontalLayoutForSingleCamera();
}
}
// 设置为纵向布局
void devstatus::setVerticalLayout()
{
// 调整主widget的尺寸以适应纵向布局
this->setMinimumSize(180, 198);
this->resize(180, 198);
// 通过调整每个frame的尺寸和位置来模拟垂直布局
adjustFramesForVerticalLayout();
LOG_DEBUG("Layout adjusted for vertical display\n");
}
// 设置为单相机横向布局(相机和机械臂各占一半)
void devstatus::setHorizontalLayoutForSingleCamera()
{
// 设置单相机模式的widget尺寸
this->setMinimumSize(180, 80);
this->resize(180, 80);
// 调整为单相机横向布局的frame尺寸和位置
adjustFramesForSingleCameraHorizontalLayout();
LOG_DEBUG("Layout adjusted for single camera horizontal display\n");
}
// 调整frames为纵向排列
void devstatus::adjustFramesForVerticalLayout()
{
int frameWidth = 180;
int frameHeight = 64;
int spacing = 2;
int startY = 0;
// 重新定位frame的位置以实现纵向排列效果
if (ui->frame_camera_1) {
ui->frame_camera_1->setGeometry(0, startY, frameWidth, frameHeight);
}
if (ui->frame_camera_2) {
ui->frame_camera_2->setGeometry(0, startY + frameHeight + spacing, frameWidth, frameHeight);
startY += frameHeight + spacing;
}
if (ui->frame_robot) {
ui->frame_robot->setGeometry(0, startY + frameHeight + spacing, frameWidth, frameHeight);
}
}
// 调整frames为单相机横向排列相机和机械臂各占一半
void devstatus::adjustFramesForSingleCameraHorizontalLayout()
{
int frameWidth = 275; // 每个frame占一半宽度 (180/2 - 5间距)
int frameHeight = 70;
int spacing = 6;
// 相机1占左半边
if (ui->frame_camera_1) {
ui->frame_camera_1->setGeometry(0, 0, frameWidth, frameHeight);
}
// 相机2隐藏在setCameraCount中已处理
// 机械臂占右半边
if (ui->frame_robot) {
ui->frame_robot->setGeometry(frameWidth + spacing, 0, frameWidth, frameHeight);
}
2025-06-19 01:38:50 +08:00
}