建立單選互斥性面板用于選擇噪聲屬性
// 創建去噪面板
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);
}
之后就是功能的具體實現