Qt: Avoid wildcard disconnect

See https://bugreports.qt.io/browse/QTBUG-134610
This commit is contained in:
Stenzek 2025-07-17 21:38:40 +10:00
parent 4b62ccf2ff
commit 6ae334b30c
No known key found for this signature in database
5 changed files with 62 additions and 17 deletions

View File

@ -168,7 +168,7 @@ void AudioSettingsWidget::updateDeviceNames()
std::vector<AudioStream::DeviceInfo> devices =
AudioStream::GetOutputDevices(backend, driver_name.c_str(), SPU::SAMPLE_RATE);
m_ui.outputDevice->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.outputDevice);
m_ui.outputDevice->clear();
m_output_device_latency = 0;

View File

@ -870,7 +870,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
SettingsInterface* const sif = m_dialog->getSettingsInterface();
{
m_ui.adapter->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.adapter);
m_ui.adapter->clear();
m_ui.adapter->addItem(tr("Default"), QVariant(QString()));
@ -906,7 +906,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
}
{
m_ui.fullscreenMode->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.fullscreenMode);
m_ui.fullscreenMode->clear();
m_ui.fullscreenMode->addItem(tr("Borderless Fullscreen"), QVariant(QString()));
@ -944,7 +944,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
if (!m_dialog->hasGameTrait(GameDatabase::Trait::DisableUpscaling))
{
m_ui.resolutionScale->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale);
m_ui.resolutionScale->clear();
const int max_scale =
@ -957,7 +957,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
}
{
m_ui.msaaMode->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.msaaMode);
m_ui.msaaMode->clear();
if (m_dialog->isPerGameSettings())
@ -1115,7 +1115,7 @@ void GraphicsSettingsWidget::onMediaCaptureBackendChanged()
.value_or(Settings::DEFAULT_MEDIA_CAPTURE_BACKEND);
{
m_ui.captureContainer->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.captureContainer);
m_ui.captureContainer->clear();
for (const auto& [name, display_name] : MediaCapture::GetContainerList(backend))
@ -1146,7 +1146,7 @@ void GraphicsSettingsWidget::onMediaCaptureContainerChanged()
const std::string container = m_dialog->getEffectiveStringValue("MediaCapture", "Container", "mp4");
{
m_ui.videoCaptureCodec->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.videoCaptureCodec);
m_ui.videoCaptureCodec->clear();
m_ui.videoCaptureCodec->addItem(tr("Default"), QVariant(QString()));
@ -1160,7 +1160,7 @@ void GraphicsSettingsWidget::onMediaCaptureContainerChanged()
}
{
m_ui.audioCaptureCodec->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.audioCaptureCodec);
m_ui.audioCaptureCodec->clear();
m_ui.audioCaptureCodec->addItem(tr("Default"), QVariant(QString()));

View File

@ -201,7 +201,7 @@ void SettingsWindow::reloadPages()
if (isPerGameSettings())
{
m_game_summary->reloadGameSettings();
m_ui.safeMode->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.safeMode);
}
m_widget_help_text_map.clear();

View File

@ -70,6 +70,8 @@ struct SettingAccessor
template<typename F>
static void connectValueChanged(T* widget, F func);
static void disconnect(T* widget);
};
template<>
@ -121,6 +123,8 @@ struct SettingAccessor<QLineEdit>
{
widget->connect(widget, &QLineEdit::textChanged, func);
}
static void disconnect(QLineEdit* widget) { QObject::disconnect(widget, &QLineEdit::textChanged, nullptr, nullptr); }
};
template<>
@ -210,6 +214,12 @@ struct SettingAccessor<QComboBox>
{
widget->connect(widget, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), func);
}
static void disconnect(QComboBox* widget)
{
QObject::disconnect(widget, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), nullptr,
nullptr);
}
};
template<>
@ -280,6 +290,11 @@ struct SettingAccessor<QCheckBox>
{
widget->connect(widget, &QCheckBox::checkStateChanged, func);
}
static void disconnect(QCheckBox* widget)
{
QObject::disconnect(widget, &QCheckBox::checkStateChanged, nullptr, nullptr);
}
};
template<>
@ -389,6 +404,13 @@ struct SettingAccessor<QSlider>
});
}
}
static void disconnect(QSlider* widget)
{
QObject::disconnect(widget, &QSlider::valueChanged, nullptr, nullptr);
if (isNullable(widget))
QObject::disconnect(widget, &QSlider::customContextMenuRequested, nullptr, nullptr);
}
};
template<>
@ -521,6 +543,13 @@ struct SettingAccessor<QSpinBox>
});
}
}
static void disconnect(QSpinBox* widget)
{
QObject::disconnect(widget, QOverload<int>::of(&QSpinBox::valueChanged), nullptr, nullptr);
if (isNullable(widget))
QObject::disconnect(widget, &QSpinBox::customContextMenuRequested, nullptr, nullptr);
}
};
template<>
@ -654,6 +683,13 @@ struct SettingAccessor<QDoubleSpinBox>
});
}
}
static void disconnect(QDoubleSpinBox* widget)
{
QObject::disconnect(widget, QOverload<double>::of(&QDoubleSpinBox::valueChanged), nullptr, nullptr);
if (isNullable(widget))
QObject::disconnect(widget, &QDoubleSpinBox::customContextMenuRequested, nullptr, nullptr);
}
};
template<>
@ -702,6 +738,8 @@ struct SettingAccessor<QAction>
{
widget->connect(widget, &QAction::toggled, func);
}
static void disconnect(QAction* widget) { QObject::disconnect(widget, &QAction::toggled, nullptr, nullptr); }
};
/// Binds a widget's value to a setting, updating it when the value changes.
@ -1492,4 +1530,11 @@ static inline void SetAvailability(WidgetType* widget, bool available)
widget->setEnabled(false);
}
template<typename WidgetType>
static inline void DisconnectWidget(WidgetType* widget)
{
using Accessor = SettingAccessor<WidgetType>;
Accessor::disconnect(widget);
}
} // namespace SettingWidgetBinder

View File

@ -518,7 +518,7 @@ void SetupWizardDialog::doMultipleDeviceAutomaticBinding(u32 port, QLabel* updat
void SetupWizardDialog::setupGraphicsPage(bool initial)
{
m_ui.renderer->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.renderer);
m_ui.renderer->clear();
for (u32 i = 0; i < static_cast<u32>(GPURenderer::Count); i++)
@ -529,14 +529,14 @@ void SetupWizardDialog::setupGraphicsPage(bool initial)
SettingWidgetBinder::BindWidgetToEnumSetting(nullptr, m_ui.renderer, "GPU", "Renderer", &Settings::ParseRendererName,
&Settings::GetRendererName, Settings::DEFAULT_GPU_RENDERER);
m_ui.resolutionScale->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale);
m_ui.resolutionScale->clear();
GraphicsSettingsWidget::populateUpscalingModes(m_ui.resolutionScale, 16);
SettingWidgetBinder::BindWidgetToIntSetting(nullptr, m_ui.resolutionScale, "GPU", "ResolutionScale", 1);
m_ui.textureFiltering->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.textureFiltering);
m_ui.textureFiltering->clear();
m_ui.spriteTextureFiltering->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.spriteTextureFiltering);
m_ui.spriteTextureFiltering->clear();
for (u32 i = 0; i < static_cast<u32>(GPUTextureFilter::Count); i++)
@ -554,7 +554,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial)
&Settings::ParseTextureFilterName, &Settings::GetTextureFilterName,
Settings::DEFAULT_GPU_TEXTURE_FILTER);
m_ui.gpuDitheringMode->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.gpuDitheringMode);
m_ui.gpuDitheringMode->clear();
for (u32 i = 0; i < static_cast<u32>(GPUDitheringMode::MaxCount); i++)
@ -567,7 +567,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial)
&Settings::ParseGPUDitheringModeName, &Settings::GetGPUDitheringModeName,
Settings::DEFAULT_GPU_DITHERING_MODE);
m_ui.displayAspectRatio->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.displayAspectRatio);
m_ui.displayAspectRatio->clear();
for (u32 i = 0; i < static_cast<u32>(DisplayAspectRatio::Count); i++)
@ -587,7 +587,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial)
&SetupWizardDialog::onGraphicsAspectRatioChanged);
onGraphicsAspectRatioChanged();
m_ui.displayCropMode->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.displayCropMode);
m_ui.displayCropMode->clear();
for (u32 i = 0; i < static_cast<u32>(DisplayCropMode::MaxCount); i++)
@ -600,7 +600,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial)
&Settings::ParseDisplayCropMode, &Settings::GetDisplayCropModeName,
Settings::DEFAULT_DISPLAY_CROP_MODE);
m_ui.displayScaling->disconnect();
SettingWidgetBinder::DisconnectWidget(m_ui.displayScaling);
m_ui.displayScaling->clear();
for (u32 i = 0; i < static_cast<u32>(DisplayScalingMode::Count); i++)