GrabBag/GrabBagApp/dialogcamera.cpp

206 lines
6.2 KiB
C++
Raw Normal View History

2025-06-08 12:48:04 +08:00
#include "dialogcamera.h"
#include "ui_dialogcamera.h"
#include <QMessageBox>
#include "VrLog.h"
#include "StyledMessageBox.h"
2025-06-08 12:48:04 +08:00
DialogCamera::DialogCamera(const std::vector<IVrEyeDevice*>& deviceList,
const std::vector<QString>& cameraNames,
QWidget *parent) :
2025-06-08 12:48:04 +08:00
QDialog(parent),
ui(new Ui::DialogCamera),
m_deviceList(deviceList),
m_cameraNames(cameraNames)
2025-06-08 12:48:04 +08:00
{
ui->setupUi(this);
// 隐藏标题栏
setWindowFlags(Qt::FramelessWindowHint);
// 检查设备列表是否有效
if (m_deviceList.empty()) {
return;
}
// 初始化相机选择下拉框
InitCameraComboBox();
// 设置默认选择第一个相机
m_currentCameraIndex = 0;
m_currentDevice = m_deviceList[0];
// 连接ComboBox的信号槽
connect(ui->combo_camera, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &DialogCamera::on_camera_selection_changed);
// 初始化界面数据
InitCameraParameters();
2025-06-08 12:48:04 +08:00
}
DialogCamera::~DialogCamera()
{
delete ui;
}
void DialogCamera::InitCameraComboBox()
{
// 清空ComboBox
ui->combo_camera->clear();
// 添加相机选项
for (size_t i = 0; i < m_cameraNames.size(); ++i) {
ui->combo_camera->addItem(m_cameraNames[i]);
}
// 默认选择第一个
if (!m_cameraNames.empty()) {
ui->combo_camera->setCurrentIndex(0);
}
// 设置ComboBox样式
ui->combo_camera->setStyleSheet("QComboBox { font-size: 18pt; color: white; }");
}
void DialogCamera::on_camera_selection_changed(int index)
{
if (index >= 0 && index < static_cast<int>(m_deviceList.size())) {
m_currentCameraIndex = index;
m_currentDevice = m_deviceList[index];
// 重新加载当前选择相机的参数
InitCameraParameters();
LOG_DEBUG("Camera selection changed to index: %d\n", index);
}
}
void DialogCamera::on_btn_camer_ok_clicked()
{
if (!m_currentDevice) {
StyledMessageBox::warning(this, "错误", "设备未初始化");
return;
}
// 应用参数配置
if (ApplyCameraParameters()) {
StyledMessageBox::information(this, "成功", "相机参数配置成功!");
accept(); // 关闭对话框并返回Accepted
} else {
StyledMessageBox::warning(this, "失败", "相机参数配置失败,请检查设备连接!");
}
}
void DialogCamera::on_btn_camer_cancel_clicked()
{
// 直接关闭窗口,不保存任何更改
reject();
}
void DialogCamera::InitCameraParameters()
{
if (!m_currentDevice) return;
try {
// 获取曝光时间
unsigned int exposeTime = 0;
if (m_currentDevice->GetEyeExpose(exposeTime) == 0) {
ui->lineEdit_export->setText(QString::number(exposeTime));
LOG_DEBUG("Current expose time: %u\n", exposeTime);
}
// 获取增益
unsigned int gain = 0;
if (m_currentDevice->GetEyeGain(gain) == 0) {
ui->lineEdit_gain->setText(QString::number(gain));
LOG_DEBUG("Current gain: %u\n", gain);
}
// 获取帧率
int frame = 0;
if (m_currentDevice->GetFrame(frame) == 0) {
ui->lineEdit_frame->setText(QString::number(frame));
LOG_DEBUG("Current frame rate: %d\n", frame);
}
// 获取摆动速度
float swingSpeed = 0.0f;
if (m_currentDevice->GetSwingSpeed(swingSpeed) == 0) {
ui->lineEdit_swing_speed->setText(QString::number(swingSpeed));
LOG_DEBUG("Swing speed: %.3f\n", swingSpeed);
}
// 获取工作角度
float minAngle = 0.0f, maxAngle = 0.0f;
if (m_currentDevice->GetSwingAngle(minAngle, maxAngle) == 0) {
ui->lineEdit_swing_start->setText(QString::number(minAngle));
ui->lineEdit_swing_stop->setText(QString::number(maxAngle));
LOG_DEBUG("Swing angle range: %.3f to %.3f\n", minAngle, maxAngle);
}
} catch (...) {
StyledMessageBox::critical(this, "错误", "读取相机参数时发生异常");
}
}
bool DialogCamera::ApplyCameraParameters()
{
if (!m_currentDevice) return false;
try {
bool success = true;
// 设置曝光时间
unsigned int exposeTime = ui->lineEdit_export->text().toUInt();
if (m_currentDevice->SetEyeExpose(exposeTime) != 0) {
LOG_WARNING("Failed to set expose time: %u\n", exposeTime);
success = false;
} else {
LOG_INFO("Set expose time: %u\n", exposeTime);
}
// 设置增益
unsigned int gain = ui->lineEdit_gain->text().toUInt();
if (m_currentDevice->SetEyeGain(gain) != 0) {
LOG_WARNING("Failed to set gain: %u\n", gain);
success = false;
} else {
LOG_INFO("Set gain: %u\n", gain);
}
// 设置帧率
int frame = ui->lineEdit_frame->text().toInt();
if (m_currentDevice->SetFrame(frame) != 0) {
LOG_WARNING("Failed to set frame rate: %d\n", frame);
success = false;
} else {
LOG_INFO("Set frame rate: %d\n", frame);
}
// 设置摆动速度
float swingSpeed = ui->lineEdit_swing_speed->text().toFloat();
if (m_currentDevice->SetSwingSpeed(swingSpeed) != 0) {
LOG_WARNING("Failed to set swing speed: %.3f\n", swingSpeed);
success = false;
} else {
LOG_INFO("Set swing speed: %.3f\n", swingSpeed);
}
// 设置工作角度
float minAngle = ui->lineEdit_swing_start->text().toFloat();
float maxAngle = ui->lineEdit_swing_stop->text().toFloat();
if (m_currentDevice->SetSwingAngle(minAngle, maxAngle) != 0) {
LOG_WARNING("Failed to set swing angle: %.3f to %.3f\n", minAngle, maxAngle);
success = false;
} else {
LOG_INFO("Set swing angle: %.3f to %.3f\n", minAngle, maxAngle);
}
return success;
} catch (...) {
StyledMessageBox::critical(this, "错误", "应用相机参数时发生异常");
return false;
}
}