GrabBag/GrabBagApp/devstatus.cpp

192 lines
5.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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); // 调整大小以适应图片
}
// 设置机械臂状态图片的私有成员函数
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); // 调整大小以适应图片
}
// 更新相机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);
}
// 设置相机数量(用于控制相机二的显示和布局方向)
void devstatus::setCameraCount(int cameraCount)
{
// 如果相机数量小于2隐藏相机二相关的UI元素
bool showCamera2 = (cameraCount >= 2);
LOG_DEBUG("setCameraCount: %d \n", cameraCount);
// 隐藏整个相机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);
}
}