Qt去噪面板搭建

建立单选互斥性面板用于选择噪声属性

// 创建去噪面板

QWidget* noisePanel = new QWidget();

QVBoxLayout* mainLayout = new QVBoxLayout(noisePanel);

mainLayout->setContentsMargins(10, 10, 10, 10);

mainLayout->setSpacing(15);

// 去噪方法选择组

QGroupBox* methodGroup = new QGroupBox("去噪方法", noisePanel);

QHBoxLayout* methodLayout = new QHBoxLayout(methodGroup);

methodLayout->setContentsMargins(10, 10, 10, 10);

methodLayout->setSpacing(10);

QGroupBox用于将相关的控件组织在一起,形成一个具有标题的分组

// 使用QButtonGroup管理互斥性
QButtonGroup* blurMethodGroup = new QButtonGroup(methodGroup)

QButtonGroup 是 Qt 框架中用于管理一组按钮的类,它本身不是可视化控件,而是提供逻辑分组功能,主要用于实现互斥选择(如单选按钮组)

QRadioButton* gaussianBlurBtn = new QRadioButton("高斯", methodGroup);
QRadioButton* medianBlurBtn = new QRadioButton("中值", methodGroup);
QRadioButton* bilateralBlurBtn = new QRadioButton("双边", methodGroup);
QRadioButton* meanBlurBtn = new QRadioButton("均值", methodGroup);
// 添加到按钮组
blurMethodGroup->addButton(gaussianBlurBtn, 0);
blurMethodGroup->addButton(medianBlurBtn, 1);
blurMethodGroup->addButton(bilateralBlurBtn, 2);
blurMethodGroup->addButton(meanBlurBtn, 3);

// 默认选中高斯模糊
gaussianBlurBtn->setChecked(true);

// 添加到布局
methodLayout->addWidget(methodLabel);
methodLayout->addWidget(gaussianBlurBtn);
methodLayout->addWidget(medianBlurBtn);
methodLayout->addWidget(bilateralBlurBtn);
methodLayout->addWidget(meanBlurBtn);
methodLayout->addStretch();
mainLayout->addWidget(methodGroup);
mainLayout->addStretch();

看一下效果

参数调节区域的设置

// 参数调节区域

QGroupBox* parameterGroup = new QGroupBox("参数调节", noisePanel);

QGridLayout* parameterLayout = new QGridLayout(parameterGroup);

parameterLayout->setContentsMargins(10, 10, 10, 10);

parameterLayout->setSpacing(10);

// 窗口大小设置

QLabel* windowSizeLabel = new QLabel("窗口大小:", parameterGroup);

QSpinBox* windowSizeSpinBox = new QSpinBox(parameterGroup);

windowSizeSpinBox->setRange(1, 31); // 限制合理范围

windowSizeSpinBox->setSingleStep(2); // 步长为2确保奇数

windowSizeSpinBox->setValue(1); // 默认值

windowSizeSpinBox->setToolTip("窗口大小必须为奇数");

windowSizeSpinBox->setFixedWidth(80);

//颜色设置

QLabel* colorLabel = new QLabel("颜色:", parameterGroup);

colorSigmaSpinBox = new QSpinBox(parameterGroup);

colorSigmaSpinBox->setRange(1, 100);

colorSigmaSpinBox->setValue(10); // 默认值

colorSigmaSpinBox->setFixedWidth(80);

//空间设置

QLabel* spaceLabel = new QLabel("空间:", parameterGroup);

spaceSigmaSpinBox = new QSpinBox(parameterGroup);

spaceSigmaSpinBox->setRange(1, 100);

spaceSigmaSpinBox->setValue(10); // 默认值

spaceSigmaSpinBox->setFixedWidth(80);

//保存设置

QWidget* save = new QWidget(noisePanel);

QHBoxLayout* saveLayout = new QHBoxLayout(save);

saveLayout->addStretch();

Blursave = new QPushButton("保存配置", save);

Blursave->setFixedWidth(80);

saveLayout->addWidget(Blursave);

// 添加到布局

methodLayout->addWidget(methodLabel);

methodLayout->addWidget(gaussianBlurBtn);

methodLayout->addWidget(medianBlurBtn);

methodLayout->addWidget(bilateralBlurBtn);

methodLayout->addWidget(meanBlurBtn);

methodLayout->addStretch();

mainLayout->addWidget(methodGroup);

parameterLayout->addWidget(windowSizeLabel, 0, 0);

parameterLayout->addWidget(windowSizeSpinBox, 0, 1);

parameterLayout->addWidget(colorLabel, 0, 2);

parameterLayout->addWidget(colorSigmaSpinBox, 0, 3);

parameterLayout->addWidget(spaceLabel, 0, 4);

parameterLayout->addWidget(spaceSigmaSpinBox, 0, 5);

mainLayout->addWidget(parameterGroup);

mainLayout->addWidget(save);

mainLayout->addStretch();

functionStack->addWidget(noisePanel);

看一下效果

下一目标调整选择逻辑

当选择相对应的去噪方法时,做对应的屏蔽处理

void OpenCVModule::setupImageNoisePanel() {

// 创建去噪面板

QWidget* noisePanel = new QWidget();

QVBoxLayout* mainLayout = new QVBoxLayout(noisePanel);

mainLayout->setContentsMargins(10, 10, 10, 10);

mainLayout->setSpacing(15);

// 去噪方法选择组

QGroupBox* methodGroup = new QGroupBox("去噪方法", noisePanel);

QHBoxLayout* methodLayout = new QHBoxLayout(methodGroup);

methodLayout->setContentsMargins(10, 10, 10, 10);

methodLayout->setSpacing(10);

// 创建方法选择标签和按钮

QLabel* methodLabel = new QLabel("噪声方法选择:", methodGroup);

// 使用QButtonGroup管理互斥性

QButtonGroup* blurMethodGroup = new QButtonGroup(methodGroup);

QRadioButton* gaussianBlurBtn = new QRadioButton("高斯", methodGroup);

QRadioButton* medianBlurBtn = new QRadioButton("中值", methodGroup);

QRadioButton* bilateralBlurBtn = new QRadioButton("双边", methodGroup);

QRadioButton* meanBlurBtn = new QRadioButton("均值", methodGroup);

// 添加到按钮组

blurMethodGroup->addButton(gaussianBlurBtn, 0);

blurMethodGroup->addButton(medianBlurBtn, 1);

blurMethodGroup->addButton(bilateralBlurBtn, 2);

blurMethodGroup->addButton(meanBlurBtn, 3);

// 默认选中高斯模糊

gaussianBlurBtn->setChecked(true);

// 参数调节区域

QGroupBox* parameterGroup = new QGroupBox("参数调节", noisePanel);

QGridLayout* parameterLayout = new QGridLayout(parameterGroup);

parameterLayout->setContentsMargins(10, 10, 10, 10);

parameterLayout->setHorizontalSpacing(5); // <<<<< 减少横向间隙

parameterLayout->setVerticalSpacing(10); // 保持垂直间隙

// 窗口大小设置

windowSizeLabel = new QLabel("窗口大小:", parameterGroup);

windowSizeSpinBox = new QSpinBox(parameterGroup);

windowSizeSpinBox->setRange(1, 31); // 限制合理范围

windowSizeSpinBox->setSingleStep(2); // 步长为2确保奇数

windowSizeSpinBox->setValue(1); // 默认值

windowSizeSpinBox->setToolTip("窗口大小必须为奇数");

windowSizeSpinBox->setFixedWidth(80);

//颜色设置

colorLabel = new QLabel("颜色:", parameterGroup);

colorSigmaSpinBox = new QSpinBox(parameterGroup);

colorSigmaSpinBox->setRange(1, 100);

colorSigmaSpinBox->setValue(10); // 默认值

colorSigmaSpinBox->setFixedWidth(80);

//空间设置

spaceLabel = new QLabel("空间:", parameterGroup);

spaceSigmaSpinBox = new QSpinBox(parameterGroup);

spaceSigmaSpinBox->setRange(1, 100);

spaceSigmaSpinBox->setValue(10); // 默认值

spaceSigmaSpinBox->setFixedWidth(80);

//保存设置

QWidget* save = new QWidget(noisePanel);

QHBoxLayout* saveLayout = new QHBoxLayout(save);

saveLayout->addStretch();

Blursave = new QPushButton("保存配置", save);

Blursave->setFixedWidth(80);

saveLayout->addWidget(Blursave);

// 添加到布局

methodLayout->addWidget(methodLabel);

methodLayout->addWidget(gaussianBlurBtn);

methodLayout->addWidget(medianBlurBtn);

methodLayout->addWidget(bilateralBlurBtn);

methodLayout->addWidget(meanBlurBtn);

methodLayout->addStretch();

mainLayout->addWidget(methodGroup);

parameterLayout->addWidget(windowSizeLabel, 0, 0);

parameterLayout->addWidget(windowSizeSpinBox, 0, 1);

parameterLayout->addWidget(colorLabel, 0, 2);

parameterLayout->addWidget(colorSigmaSpinBox, 0, 3);

parameterLayout->addWidget(spaceLabel, 0, 4);

parameterLayout->addWidget(spaceSigmaSpinBox, 0, 5);

mainLayout->addWidget(parameterGroup);

mainLayout->addWidget(save);

mainLayout->addStretch();

functionStack->addWidget(noisePanel);

// 手动设置初始参数状态(不触发日志)(不然会报冲突)

colorLabel->setEnabled(false);

colorSigmaSpinBox->setEnabled(false);

spaceLabel->setEnabled(false);

spaceSigmaSpinBox->setEnabled(false);

windowSizeLabel->setEnabled(true);

windowSizeSpinBox->setEnabled(true);

//切换逻辑

connect(blurMethodGroup, &QButtonGroup::idToggled, this, &OpenCVModule::onBlurChanged);

}

void OpenCVModule::updateParameterState(int id) {

// 默认禁用颜色和空间参数

colorLabel->setEnabled(false);

colorSigmaSpinBox->setEnabled(false);

spaceLabel->setEnabled(false);

spaceSigmaSpinBox->setEnabled(false);

// 窗口大小始终启用

windowSizeLabel->setEnabled(true);

windowSizeSpinBox->setEnabled(true);

// 根据模糊类型启用相关参数

switch (id) {

case 0: // 高斯模糊

addLog("选择高斯模糊", LogLevel::Info);

break;

case 1: // 中值模糊

addLog("选择中值模糊", LogLevel::Info);

break;

case 2: // 双边模糊

colorLabel->setEnabled(true);

colorSigmaSpinBox->setEnabled(true);

spaceLabel->setEnabled(true);

spaceSigmaSpinBox->setEnabled(true);

addLog("选择双边模糊", LogLevel::Info);

break;

case 3: // 均值迁移

colorLabel->setEnabled(true);

colorSigmaSpinBox->setEnabled(true);

spaceLabel->setEnabled(true);

spaceSigmaSpinBox->setEnabled(true);

addLog("选择均值迁移", LogLevel::Info);

break;

}

}

void OpenCVModule::onBlurChanged(int id, bool checked) {

if (!checked) return;

currentBlurMethodId = id;

updateParameterState(id);

}


之后就是功能的具体实现

相关推荐
Ashlee_code22 分钟前
南太平洋金融基建革命:斐济-巴新交易所联盟的技术破局之路 ——从关税动荡到离岸红利,跨境科技如何重塑太平洋资本生态
java·开发语言·科技·金融·重构·web3·php
隐-梵23 分钟前
2025年测绘程序设计比赛--基于统计滤波的点云去噪(已获国特)
java·开发语言·windows·c#·.net
没有梦想的咸鱼185-1037-166325 分钟前
MATLAB科研数据可视化技术
开发语言·机器学习·matlab·信息可视化·数据分析
叉烧钵钵鸡1 小时前
Java ++i 与 i++ 底层原理
java·开发语言·后端
御水流红叶1 小时前
安卓加固脱壳
android·开发语言·python
hqxstudying1 小时前
SpringAI的使用
java·开发语言·人工智能·springai
狐小粟同学1 小时前
JAVAEE--4.多线程案例
java·开发语言
the beard2 小时前
RabbitMQ:基于SpringAMQP声明队列与交换机并配置消息转换器(三)
java·开发语言·rabbitmq·intellij idea
Warren982 小时前
Java泛型
java·开发语言·windows·笔记·python·spring·maven
仪器科学与传感技术博士2 小时前
python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
开发语言·python·算法·机器学习·支持向量机·过拟合·欠拟合