from io import BytesIO import qrcode from PyQt6.QtWidgets import QDialog, QLabel, QPushButton, QVBoxLayout from PyQt6.QtGui import QPixmap from PyQt6.QtCore import Qt class QRCodeDialog(QDialog): def __init__(self, address_text, full_amount, currency_type=None, parent=None): super().__init__(parent) self.currency_type = currency_type self.setWindowTitle("Payment Address QR Code") self.setFixedSize(400, 450) self.setModal(True) layout = QVBoxLayout(self) title_label = QLabel("Scan QR Code to Copy Address", self) title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) title_label.setStyleSheet( "font-size: 16px; font-weight: bold; color: #00ffff; margin: 10px;") layout.addWidget(title_label) qr_label = QLabel(self) qr_label.setAlignment(Qt.AlignmentFlag.AlignCenter) qr_label.setStyleSheet( "margin: 10px; border: 2px solid #00ffff; border-radius: 10px;") qr_pixmap = self.generate_qr_code(address_text, full_amount) qr_label.setPixmap(qr_pixmap) layout.addWidget(qr_label) amount_label = QLabel("Amount:", self) amount_label.setStyleSheet( "font-size: 12px; color: #ffffff; margin-top: 10px;") layout.addWidget(amount_label) amount_text_label = QLabel(full_amount, self) amount_text_label.setStyleSheet( "font-size: 10px; color: #cccccc; margin: 5px; padding: 5px; border: 1px solid #666; border-radius: 5px;") layout.addWidget(amount_text_label) address_label = QLabel("Address:", self) address_label.setStyleSheet( "font-size: 12px; color: #ffffff; margin-top: 10px;") layout.addWidget(address_label) address_text_label = QLabel(address_text, self) address_text_label.setWordWrap(True) address_text_label.setStyleSheet( "font-size: 10px; color: #cccccc; margin: 5px; padding: 5px; border: 1px solid #666; border-radius: 5px;") layout.addWidget(address_text_label) close_button = QPushButton("Close", self) close_button.setStyleSheet( "font-size: 14px; padding: 8px; margin: 10px;") close_button.clicked.connect(self.close) layout.addWidget(close_button) self.setStyleSheet(""" QDialog { background-color: #2c3e50; border: 2px solid #00ffff; border-radius: 10px; } """) def generate_qr_code(self, text, full_amount): qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=8, border=4, ) if self.currency_type: currency_lower = self.currency_type.lower() if currency_lower == 'bitcoin': qr_data = f"bitcoin:{text}?amount={full_amount}" elif currency_lower == 'monero': qr_data = f"monero:{text}?amount={full_amount}" elif currency_lower == 'lightning': qr_data = f"bitcoin:{text}?amount={full_amount}&lightning=ln" elif currency_lower == 'litecoin': qr_data = f"litecoin:{text}?amount={full_amount}" else: qr_data = f"{text}?amount={full_amount}" else: qr_data = text qr.add_data(qr_data) qr.make(fit=True) qr_image = qr.make_image(fill_color="black", back_color="white") buffer = BytesIO() qr_image.save(buffer, format='PNG') buffer.seek(0) pixmap = QPixmap() pixmap.loadFromData(buffer.getvalue()) return pixmap.scaled(150, 150, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)