Wladimir J. van der Laan
13 years ago
13 changed files with 434 additions and 7 deletions
@ -0,0 +1,213 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>QRCodeDialog</class> |
||||||
|
<widget class="QDialog" name="QRCodeDialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>320</width> |
||||||
|
<height>404</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Dialog</string> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="lblQRCode"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>300</width> |
||||||
|
<height>300</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>QR Code</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QWidget" name="widget" native="true"> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||||
|
<item> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||||
|
<item> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QCheckBox" name="chkReq"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Request Payment</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="lblAm1"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Maximum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Amount:</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
<property name="buddy"> |
||||||
|
<cstring>lnReqAmount</cstring> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLineEdit" name="lnReqAmount"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>60</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="lblAm2"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Maximum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>BTC</string> |
||||||
|
</property> |
||||||
|
<property name="buddy"> |
||||||
|
<cstring>lnReqAmount</cstring> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="label_3"> |
||||||
|
<property name="text"> |
||||||
|
<string>Label:</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
<property name="buddy"> |
||||||
|
<cstring>lnLabel</cstring> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QLineEdit" name="lnLabel"> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>100</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QLabel" name="label_4"> |
||||||
|
<property name="text"> |
||||||
|
<string>Message:</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
<property name="buddy"> |
||||||
|
<cstring>lnMessage</cstring> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QLineEdit" name="lnMessage"> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>100</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>40</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="btnSaveAs"> |
||||||
|
<property name="text"> |
||||||
|
<string>&Save As...</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections> |
||||||
|
<connection> |
||||||
|
<sender>chkReq</sender> |
||||||
|
<signal>clicked(bool)</signal> |
||||||
|
<receiver>lnReqAmount</receiver> |
||||||
|
<slot>setEnabled(bool)</slot> |
||||||
|
<hints> |
||||||
|
<hint type="sourcelabel"> |
||||||
|
<x>92</x> |
||||||
|
<y>285</y> |
||||||
|
</hint> |
||||||
|
<hint type="destinationlabel"> |
||||||
|
<x>98</x> |
||||||
|
<y>311</y> |
||||||
|
</hint> |
||||||
|
</hints> |
||||||
|
</connection> |
||||||
|
</connections> |
||||||
|
</ui> |
@ -0,0 +1,106 @@ |
|||||||
|
#include "qrcodedialog.h" |
||||||
|
#include "ui_qrcodedialog.h" |
||||||
|
#include <QPixmap> |
||||||
|
#include <QUrl> |
||||||
|
#include <QFileDialog> |
||||||
|
#include <QDesktopServices> |
||||||
|
#include <QDebug> |
||||||
|
|
||||||
|
#include <qrencode.h> |
||||||
|
|
||||||
|
#define EXPORT_IMAGE_SIZE 256 |
||||||
|
|
||||||
|
QRCodeDialog::QRCodeDialog(const QString &title, const QString &addr, const QString &label, bool enableReq, QWidget *parent) : |
||||||
|
QDialog(parent), |
||||||
|
ui(new Ui::QRCodeDialog), |
||||||
|
address(addr) |
||||||
|
{ |
||||||
|
ui->setupUi(this); |
||||||
|
setWindowTitle(title); |
||||||
|
setAttribute(Qt::WA_DeleteOnClose); |
||||||
|
|
||||||
|
ui->chkReq->setVisible(enableReq); |
||||||
|
ui->lnReqAmount->setVisible(enableReq); |
||||||
|
ui->lblAm1->setVisible(enableReq); |
||||||
|
ui->lblAm2->setVisible(enableReq); |
||||||
|
|
||||||
|
ui->lnLabel->setText(label); |
||||||
|
|
||||||
|
genCode(); |
||||||
|
} |
||||||
|
|
||||||
|
QRCodeDialog::~QRCodeDialog() |
||||||
|
{ |
||||||
|
delete ui; |
||||||
|
} |
||||||
|
|
||||||
|
void QRCodeDialog::genCode() { |
||||||
|
|
||||||
|
QString uri = getURI(); |
||||||
|
//qDebug() << "Encoding:" << uri.toUtf8().constData();
|
||||||
|
QRcode *code = QRcode_encodeString(uri.toUtf8().constData(), 0, QR_ECLEVEL_L, QR_MODE_8, 1); |
||||||
|
myImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32); |
||||||
|
myImage.fill(0xffffff); |
||||||
|
unsigned char *p = code->data; |
||||||
|
for(int y = 0; y < code->width; y++) { |
||||||
|
for(int x = 0; x < code->width; x++) { |
||||||
|
myImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff)); |
||||||
|
p++; |
||||||
|
} |
||||||
|
} |
||||||
|
QRcode_free(code); |
||||||
|
ui->lblQRCode->setPixmap(QPixmap::fromImage(myImage).scaled(300, 300)); |
||||||
|
} |
||||||
|
|
||||||
|
QString QRCodeDialog::getURI() { |
||||||
|
QString ret = QString("bitcoin:%1").arg(address); |
||||||
|
|
||||||
|
int paramCount = 0; |
||||||
|
if(ui->chkReq->isChecked() && ui->lnReqAmount->text().isEmpty() == false) { |
||||||
|
bool ok= false; |
||||||
|
double amount = ui->lnReqAmount->text().toDouble(&ok); |
||||||
|
if(ok) { |
||||||
|
ret += QString("?amount=%1X8").arg(ui->lnReqAmount->text()); |
||||||
|
paramCount++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if(ui->lnLabel->text().isEmpty() == false) { |
||||||
|
QString lbl(QUrl::toPercentEncoding(ui->lnLabel->text())); |
||||||
|
ret += QString("%1label=%2").arg(paramCount == 0 ? "?" : "&").arg(lbl); |
||||||
|
paramCount++; |
||||||
|
} |
||||||
|
|
||||||
|
if(ui->lnMessage->text().isEmpty() == false) { |
||||||
|
QString msg(QUrl::toPercentEncoding(ui->lnMessage->text())); |
||||||
|
ret += QString("%1message=%2").arg(paramCount == 0 ? "?" : "&").arg(msg); |
||||||
|
paramCount++; |
||||||
|
} |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
void QRCodeDialog::on_lnReqAmount_textChanged(const QString &) { |
||||||
|
genCode(); |
||||||
|
} |
||||||
|
|
||||||
|
void QRCodeDialog::on_lnLabel_textChanged(const QString &) { |
||||||
|
genCode(); |
||||||
|
} |
||||||
|
|
||||||
|
void QRCodeDialog::on_lnMessage_textChanged(const QString &) { |
||||||
|
genCode(); |
||||||
|
} |
||||||
|
|
||||||
|
void QRCodeDialog::on_btnSaveAs_clicked() |
||||||
|
{ |
||||||
|
QString fn = QFileDialog::getSaveFileName(this, "Save Image...", QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation), "Images (*.png)"); |
||||||
|
if(!fn.isEmpty()) { |
||||||
|
myImage.scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE).save(fn); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void QRCodeDialog::on_chkReq_toggled(bool) |
||||||
|
{ |
||||||
|
genCode(); |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
#ifndef QRCODEDIALOG_H |
||||||
|
#define QRCODEDIALOG_H |
||||||
|
|
||||||
|
#include <QDialog> |
||||||
|
#include <QImage> |
||||||
|
|
||||||
|
namespace Ui { |
||||||
|
class QRCodeDialog; |
||||||
|
} |
||||||
|
|
||||||
|
class QRCodeDialog : public QDialog |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
explicit QRCodeDialog(const QString &title, const QString &address, const QString &label, bool allowReq, QWidget *parent = 0); |
||||||
|
~QRCodeDialog(); |
||||||
|
|
||||||
|
private slots: |
||||||
|
void on_lnReqAmount_textChanged(const QString &arg1); |
||||||
|
void on_lnLabel_textChanged(const QString &arg1); |
||||||
|
void on_lnMessage_textChanged(const QString &arg1); |
||||||
|
void on_btnSaveAs_clicked(); |
||||||
|
|
||||||
|
void on_chkReq_toggled(bool checked); |
||||||
|
|
||||||
|
private: |
||||||
|
Ui::QRCodeDialog *ui; |
||||||
|
QImage myImage; |
||||||
|
|
||||||
|
QString getURI(); |
||||||
|
QString address; |
||||||
|
|
||||||
|
void genCode(); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // QRCODEDIALOG_H
|
After Width: | Height: | Size: 5.9 KiB |
Loading…
Reference in new issue