#include "dialogs/InpaintPreviewDialog.h" #include #include #include #include #include #include #include #include #include static QLabel* makeImageLabel(QWidget* parent) { auto* lab = new QLabel(parent); lab->setBackgroundRole(QPalette::Base); lab->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); lab->setScaledContents(false); lab->setAlignment(Qt::AlignCenter); lab->setMinimumSize(1, 1); return lab; } InpaintPreviewDialog::InpaintPreviewDialog(const QString& title, QWidget* parent) : QDialog(parent) { setModal(true); setMinimumSize(880, 520); setWindowTitle(title); auto* root = new QVBoxLayout(this); root->setContentsMargins(8, 8, 8, 8); root->setSpacing(8); m_beforeLabel = makeImageLabel(this); m_afterLabel = makeImageLabel(this); m_beforeLabel->installEventFilter(this); m_afterLabel->installEventFilter(this); auto* splitter = new QSplitter(Qt::Horizontal, this); splitter->addWidget(m_beforeLabel); splitter->addWidget(m_afterLabel); splitter->setStretchFactor(0, 1); splitter->setStretchFactor(1, 1); root->addWidget(splitter, 1); auto* btns = new QDialogButtonBox(this); btns->addButton(QStringLiteral("取消"), QDialogButtonBox::RejectRole); btns->addButton(QStringLiteral("写回"), QDialogButtonBox::AcceptRole); connect(btns, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(btns, &QDialogButtonBox::rejected, this, &QDialog::reject); root->addWidget(btns); } void InpaintPreviewDialog::setImages(const QImage& before, const QImage& after) { m_beforeImg = before; m_afterImg = after; updateScaledPreviews(); QTimer::singleShot(0, this, [this]() { updateScaledPreviews(); }); } void InpaintPreviewDialog::resizeEvent(QResizeEvent* e) { QDialog::resizeEvent(e); updateScaledPreviews(); } void InpaintPreviewDialog::showEvent(QShowEvent* e) { QDialog::showEvent(e); updateScaledPreviews(); } bool InpaintPreviewDialog::eventFilter(QObject* watched, QEvent* event) { if (!m_inUpdateScaledPreviews && event->type() == QEvent::Resize) { if (watched == m_beforeLabel || watched == m_afterLabel) { updateScaledPreviews(); } } return QDialog::eventFilter(watched, event); } void InpaintPreviewDialog::updateScaledPreviews() { if (m_inUpdateScaledPreviews) { return; } m_inUpdateScaledPreviews = true; auto fit = [](QLabel* lab, const QImage& src) { if (!lab || src.isNull()) { if (lab) { lab->clear(); } return; } const QSize cap = lab->size(); if (cap.width() < 2 || cap.height() < 2) { return; } const QImage scaled = src.scaled(cap, Qt::KeepAspectRatio, Qt::SmoothTransformation); lab->setPixmap(QPixmap::fromImage(scaled)); }; fit(m_beforeLabel, m_beforeImg); fit(m_afterLabel, m_afterImg); m_inUpdateScaledPreviews = false; }