@@ -19,6 +19,7 @@ RonchiCompareDialog::RonchiCompareDialog(const QImage& img1, const QString& name
1919 resize (dlgW, dlgH);
2020 // Main layout for the dialog
2121 QVBoxLayout* mainLayout = new QVBoxLayout (this );
22+ QHBoxLayout* blinkLayout = new QHBoxLayout ();
2223
2324 // 1. Color Legend Labels at the top
2425 QHBoxLayout* legendLayout = new QHBoxLayout ();
@@ -48,19 +49,29 @@ RonchiCompareDialog::RonchiCompareDialog(const QImage& img1, const QString& name
4849 mainLayout->addWidget (m_displayLabel, 1 );
4950
5051 // 3. Controls Area
51- mainLayout->addWidget (new QLabel (tr (" Blend Ratio (Slide to compare difference):" )));
52-
53- QSlider* slider = new QSlider (Qt::Horizontal);
54- slider->setRange (0 , 100 );
55- slider->setValue (50 );
56- mainLayout->addWidget (slider);
57-
58- QPushButton* saveBtn = new QPushButton (tr (" Save This Comparison Image" ));
59- mainLayout->addWidget (saveBtn);
52+ mainLayout->addWidget (m_info = new QLabel (tr (" Blend Ratio (Slide to compare difference):" )));
53+ m_info->setAlignment (Qt::AlignCenter);
54+ m_info->setStyleSheet (" font-weight: bold; font-size: 24px; color: #4CAF50; padding: 5px;" );
55+ m_slider = new QSlider (Qt::Horizontal);
56+ m_slider->setRange (0 , 100 );
57+ m_slider->setValue (50 );
58+ mainLayout->addWidget (m_slider);
59+
60+ m_saveBtn = new QPushButton (tr (" Save This Comparison Image" ));
61+ QPushButton* blinkBtn = new QPushButton (tr (" Blink" ));
62+ mainLayout->addWidget (m_saveBtn);
63+
64+ blinkLayout->addSpacerItem ( new QSpacerItem (0 , 0 , QSizePolicy::Expanding, QSizePolicy::Expanding));
65+ blinkLayout->addWidget (blinkBtn);
66+ blinkLayout->addSpacerItem ( new QSpacerItem (0 , 0 , QSizePolicy::Expanding, QSizePolicy::Expanding));
67+ mainLayout->addLayout (blinkLayout);
68+ blinkTimer = new QTimer (this );
6069
6170 // Signal/Slot Connections
62- connect (slider, &QSlider::valueChanged, this , &RonchiCompareDialog::updateOverlay);
63- connect (saveBtn, &QPushButton::clicked, this , &RonchiCompareDialog::onSaveClicked);
71+ connect (m_slider, &QSlider::valueChanged, this , &RonchiCompareDialog::updateOverlay);
72+ connect (m_saveBtn, &QPushButton::clicked, this , &RonchiCompareDialog::onSaveClicked);
73+ connect (blinkBtn, &QPushButton::clicked, this , &RonchiCompareDialog::startBlink);
74+ connect (blinkTimer, &QTimer::timeout, this , &RonchiCompareDialog::blink);
6475
6576 // Perform initial render
6677 updateOverlay (50 );
@@ -72,6 +83,36 @@ RonchiCompareDialog::~RonchiCompareDialog()
7283 // Destructor implementation to satisfy vtable requirements
7384}
7485
86+ void RonchiCompareDialog::startBlink (){
87+ if (blinking){
88+ blinkTimer->stop ();
89+ updateOverlay (50 );
90+ blinking = false ;
91+ m_slider->show ();
92+ m_saveBtn->show ();
93+ m_info->setText (tr (" Blend Ratio (Slide to compare difference):" ));
94+ }
95+ else {
96+ blinking = true ;
97+ blinkTimer->start (300 );
98+ m_slider->hide ();
99+ m_saveBtn->hide ();
100+ }
101+ }
102+
103+ void RonchiCompareDialog::blink (){
104+ blinkone = !blinkone;
105+ if (blinkone){
106+ m_displayLabel->setPixmap (QPixmap::fromImage (m_q1));
107+ m_info->setText (m_baseLabel->text ());
108+ }
109+ else {
110+ m_displayLabel->setPixmap (QPixmap::fromImage (m_q2));
111+ m_info->setText (m_compLabel->text ());
112+ }
113+ blinkTimer->start (300 );
114+ }
115+
75116cv::Mat RonchiCompareDialog::qImageToMat (const QImage& image)
76117{
77118 // Force conversion to 4-channel ARGB to ensure predictable memory layout for OpenCV
0 commit comments