#include "pagepay_card.h" #include "ui_pagepay_card.h" #include #include #include #include #include #include #include #include #include #include #include // ⏳ 텍스트를 Pixmap으로 렌더링 static QPixmap textToPixmap(const QString &text, int fontPx) { QFont f; f.setPixelSize(fontPx); const int size = fontPx * 2; QPixmap pm(size, size); pm.fill(Qt::transparent); QPainter p(&pm); p.setRenderHint(QPainter::Antialiasing, true); p.setRenderHint(QPainter::TextAntialiasing, true); p.setFont(f); p.setPen(Qt::black); p.drawText(pm.rect(), Qt::AlignCenter, text); return pm; } // Pixmap을 고정 캔버스 안에서 회전 static QPixmap rotatedPixmap(const QPixmap &src, qreal angleDeg) { QPixmap out(src.size()); out.fill(Qt::transparent); QPainter p(&out); p.setRenderHint(QPainter::Antialiasing, true); p.setRenderHint(QPainter::SmoothPixmapTransform, true); const QPointF c(out.width() / 2.0, out.height() / 2.0); p.translate(c); p.rotate(angleDeg); p.translate(-c); p.drawPixmap(0, 0, src); return out; } pagepay_card::pagepay_card(QWidget *parent) : QWidget(parent) , ui(new Ui::pagepay_card) { ui->setupUi(this); } pagepay_card::~pagepay_card() { delete ui; } void pagepay_card::showEvent(QShowEvent *e) { QWidget::showEvent(e); // 페이지가 뜬 뒤 모달 띄우기 QTimer::singleShot(0, this, [this]() { showPaymentModal(); }); } void pagepay_card::showPaymentModal() { QWidget *parentW = this->window(); if (!parentW) parentW = this; // ✅ 팝업 자체를 카드 크기로만 만들기 (전체 덮지 않음) QDialog *dlg = new QDialog(parentW); dlg->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); dlg->setModal(true); dlg->setAttribute(Qt::WA_DeleteOnClose); dlg->setFixedSize(520, 260); // ✅ 부모(800x480) 기준 "정중앙" 위치 const int x = (parentW->width() - dlg->width()) / 2; const int y = (parentW->height() - dlg->height()) / 2; dlg->move(x, y); // ===== 다이얼로그 루트 레이아웃 ===== auto *dlgLay = new QVBoxLayout(dlg); dlgLay->setContentsMargins(0,0,0,0); dlgLay->setSpacing(0); // ===== 카드 프레임 (둥근 모서리) ===== QFrame *card = new QFrame(dlg); card->setObjectName("card"); card->setStyleSheet( "#card { background: white; border-radius: 16px; }" ); dlgLay->addWidget(card); // ===== 카드 내부 스택 ===== QStackedWidget *stack = new QStackedWidget(card); QVBoxLayout *cardLay = new QVBoxLayout(card); cardLay->setContentsMargins(24,24,24,24); cardLay->addWidget(stack); // --- processing --- QWidget *wProc = new QWidget(card); QVBoxLayout *pLay = new QVBoxLayout(wProc); pLay->setContentsMargins(0,0,0,0); pLay->setSpacing(12); QLabel *spinner = new QLabel(wProc); spinner->setAlignment(Qt::AlignCenter); spinner->setStyleSheet("background: transparent;"); const QPixmap baseHourglass = textToPixmap("⏳", 52); spinner->setPixmap(baseHourglass); QLabel *title = new QLabel("카드를 뽑지말아주세요", wProc); title->setAlignment(Qt::AlignCenter); title->setStyleSheet("font-size: 22px; font-weight: 800; color: #111827;"); QLabel *desc = new QLabel("결제가 진행중입니다", wProc); desc->setAlignment(Qt::AlignCenter); desc->setStyleSheet("font-size: 14px; color: #6B7280;"); QLabel *countLbl = new QLabel("5", wProc); countLbl->setAlignment(Qt::AlignCenter); countLbl->setStyleSheet("font-size: 64px; font-weight: 900; color: #2563EB; margin-top: 6px;"); pLay->addStretch(); pLay->addWidget(spinner); pLay->addWidget(title); pLay->addWidget(desc); pLay->addWidget(countLbl); pLay->addStretch(); // --- complete --- QWidget *wDone = new QWidget(card); QVBoxLayout *dLay = new QVBoxLayout(wDone); dLay->setContentsMargins(0,0,0,0); dLay->setSpacing(16); QLabel *check = new QLabel("✓", wDone); check->setAlignment(Qt::AlignCenter); check->setStyleSheet("font-size: 72px; font-weight: 900; color: #22C55E;"); QLabel *doneTxt = new QLabel("결제가 완료되었습니다", wDone); doneTxt->setAlignment(Qt::AlignCenter); doneTxt->setStyleSheet("font-size: 22px; font-weight: 800; color: #111827;"); QPushButton *btnOk = new QPushButton("확인", wDone); btnOk->setFixedHeight(44); btnOk->setFixedWidth(180); btnOk->setStyleSheet( "QPushButton{background:#2563EB;color:white;border:none;border-radius:12px;font-size:16px;font-weight:800; padding: 0 18px;}" "QPushButton:hover{background:#1D4ED8;}" "QPushButton:pressed{background:#1E40AF;}" ); dLay->addStretch(); dLay->addWidget(check); dLay->addWidget(doneTxt); dLay->addWidget(btnOk, 0, Qt::AlignHCenter); dLay->addStretch(); stack->addWidget(wProc); stack->addWidget(wDone); stack->setCurrentWidget(wProc); // ===== (A) ⏳ 회전 타이머 (느리게) ===== auto angle = QSharedPointer::create(0.0); QTimer *spinTimer = new QTimer(dlg); spinTimer->setInterval(30); // ✅ 16ms(빠름) -> 30ms(느리게) QObject::connect(spinTimer, &QTimer::timeout, dlg, [=]() mutable { *angle += 2.0; // ✅ 4.0(빠름) -> 2.0(느리게) if (*angle >= 360.0) *angle -= 360.0; spinner->setPixmap(rotatedPixmap(baseHourglass, *angle)); }); spinTimer->start(); // ===== (B) 5초 카운트다운 ===== auto count = QSharedPointer::create(5); QTimer *t = new QTimer(dlg); t->setInterval(1000); QObject::connect(t, &QTimer::timeout, dlg, [=]() mutable { (*count)--; if (*count >= 0) countLbl->setText(QString::number(*count)); if (*count <= 0) { t->stop(); spinTimer->stop(); stack->setCurrentWidget(wDone); } }); QObject::connect(btnOk, &QPushButton::clicked, dlg, [this, dlg]() { dlg->accept(); emit goTotalPayClicked(); }); t->start(); dlg->exec(); }