From 4b1c5e80e94a4804c4d75d6b2ba790093fb71425 Mon Sep 17 00:00:00 2001 From: agilob Date: Sat, 7 Mar 2015 12:40:45 +0000 Subject: [PATCH 01/11] qrcode support by html tooltip --- src/misc/qrwidget.cpp | 87 +++++++++++++++++++++++ src/misc/qrwidget.h | 24 +++++++ src/widget/form/settings/identityform.cpp | 7 ++ 3 files changed, 118 insertions(+) create mode 100644 src/misc/qrwidget.cpp create mode 100644 src/misc/qrwidget.h diff --git a/src/misc/qrwidget.cpp b/src/misc/qrwidget.cpp new file mode 100644 index 000000000..19ff2b42c --- /dev/null +++ b/src/misc/qrwidget.cpp @@ -0,0 +1,87 @@ +#include "qrwidget.h" +#include +#include +#include +#include +#include "qrcodewindow.h" +#include "qrencode.h" + +QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0") +//Note: The encoding fails with empty string so I just default to something else. Use the setQRData() call to change this. +{ + //size of the qimage might be problematic in the future, but it works for me + size.setWidth(480); + size.setHeight(480); + image = new QImage(size, QImage::Format_RGB32); +} + +void QRWidget::setQRData(QString data) +{ + this->data = data; + paintImage(); +} + +QString QRWidget::getImageAsText() +{ + paintImage(); + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + image->save(&buffer, "PNG"); // writes the image in PNG format inside the buffer + + QString iconBase64 = QString::fromLatin1(ba.toBase64().data()); + QString base64Image = ""; + + return QString(base64Image); +} + +//http://stackoverflow.com/questions/21400254/how-to-draw-a-qr-code-with-qt-in-native-c-c +void QRWidget::paintImage() +{ + QPainter painter(image); + //NOTE: I have hardcoded some parameters here that would make more sense as variables. + QRcode *qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 0); + + if(0 != qr) + { + QColor fg("black"); + QColor bg("white"); + painter.setBrush(bg); + painter.setPen(Qt::NoPen); + painter.drawRect(0, 0, size.width(), size.height()); + painter.setBrush(fg); + const int s = qr->width>0 ? qr->width : 1; + const double w = width(); + const double h = height(); + const double aspect = w / h; + const double scale = ((aspect > 1.0) ? h : w) / s; + + for(int y = 0; y < s; y++) + { + const int yy = y * s; + for(int x = 0; x < s; x++) + { + const int xx = yy + x; + const unsigned char b = qr->data[xx]; + if(b & 0x01) + { + const double rx1 = x * scale, + ry1 = y * scale; + QRectF r(rx1, ry1, scale, scale); + painter.drawRects(&r, 1); + } + } + } + QRcode_free(qr); + painter.save(); + } + else + { + QColor error("red"); + painter.setBrush(error); + painter.drawRect(0, 0, width(), height()); + qDebug() << "QR FAIL: " << strerror(errno); + } + + qr = 0; +} diff --git a/src/misc/qrwidget.h b/src/misc/qrwidget.h new file mode 100644 index 000000000..10454a65c --- /dev/null +++ b/src/misc/qrwidget.h @@ -0,0 +1,24 @@ +#ifndef QRWIDGET_H +#define QRWIDGET_H + +// https://stackoverflow.com/questions/21400254/how-to-draw-a-qr-code-with-qt-in-native-c-c + +#include + +class QRWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QRWidget(QWidget *parent = 0); + void setQRData(QString data); + QString getImageAsText(); + +private: + QString data; + void paintImage(); + QImage *image; + QSize size; +}; + +#endif // QRWIDGET_H diff --git a/src/widget/form/settings/identityform.cpp b/src/widget/form/settings/identityform.cpp index 9197f860e..a45fa1978 100644 --- a/src/widget/form/settings/identityform.cpp +++ b/src/widget/form/settings/identityform.cpp @@ -30,6 +30,8 @@ #include #include #include +#include "src/misc/qrwidget.h" +#include "qrencode.h" IdentityForm::IdentityForm() : GenericForm(tr("Identity"), QPixmap(":/img/settings/identity.png")) @@ -126,6 +128,11 @@ void IdentityForm::setToxId(const QString& id) { toxId->setText(id); toxId->setCursorPosition(0); + + QRWidget *qrcode = new QRWidget(); + qrcode->setQRData(id); + + toxId->setToolTip(qrcode->getImageAsText()); } void IdentityForm::onLoadClicked() From 34360741cbe303417608afa008e119ed5455a0a5 Mon Sep 17 00:00:00 2001 From: agilob Date: Sat, 7 Mar 2015 12:41:45 +0000 Subject: [PATCH 02/11] I am not sure about this commit, someone check it please --- qtox.pro | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/qtox.pro b/qtox.pro index a40b7fc9f..f47967f81 100644 --- a/qtox.pro +++ b/qtox.pro @@ -134,7 +134,7 @@ win32 { LIBS += -L$$PWD/libs/lib -ltoxav -ltoxcore -ltoxencryptsave -ltoxdns -lsodium -lvpx -lpthread LIBS += -L$$PWD/libs/lib -lopencv_core249 -lopencv_highgui249 -lopencv_imgproc249 -lOpenAL32 -lopus LIBS += -lopengl32 -lole32 -loleaut32 -luuid -lvfw32 -lws2_32 -liphlpapi -lz - + LIBS += -lqrencode contains(DEFINES, QTOX_FILTER_AUDIO) { contains(STATICPKG, YES) { LIBS += -Wl,-Bstatic -lfilteraudio @@ -149,6 +149,7 @@ win32 { QMAKE_INFO_PLIST = osx/info.plist QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lsodium -lvpx -lopus -framework OpenAL -lopencv_core -lopencv_highgui -mmacosx-version-min=10.7 + LIBS += -lqrencode contains(DEFINES, QTOX_PLATFORM_EXT) { LIBS += -framework IOKit -framework CoreFoundation } contains(DEFINES, QTOX_FILTER_AUDIO) { LIBS += -lfilteraudio } } else { @@ -165,8 +166,10 @@ win32 { LIBS += -L$$PWD/libs/lib/ -lopus -lvpx -lopenal -Wl,-Bstatic -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lsodium -lopencv_highgui -lopencv_imgproc -lopencv_core -lz -Wl,-Bdynamic LIBS += -Wl,-Bstatic -ljpeg -ltiff -lpng -ljasper -lIlmImf -lIlmThread -lIex -ldc1394 -lraw1394 -lHalf -lz -llzma -ljbig LIBS += -Wl,-Bdynamic -lv4l1 -lv4l2 -lavformat -lavcodec -lavutil -lswscale -lusb-1.0 + LIBS += -lqrencode } else { LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lvpx -lsodium -lopenal -lopencv_core -lopencv_highgui -lopencv_imgproc + LIBS += -lqrencode } contains(DEFINES, QTOX_PLATFORM_EXT) { @@ -424,7 +427,8 @@ SOURCES += \ src/video/netvideosource.cpp \ src/video/videoframe.cpp \ src/widget/gui.cpp \ - src/toxme.cpp + src/toxme.cpp \ + src/misc/qrwidget.cpp HEADERS += \ src/audio.h \ @@ -445,4 +449,5 @@ HEADERS += \ src/video/videoframe.h \ src/video/videosource.h \ src/widget/gui.h \ - src/toxme.h + src/toxme.h \ + src/misc/qrwidget.h From 3096d2422fb1654ee8739ff3ae43216200b92299 Mon Sep 17 00:00:00 2001 From: agilob Date: Sat, 7 Mar 2015 12:45:45 +0000 Subject: [PATCH 03/11] updated simple_make --- simple_make.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/simple_make.sh b/simple_make.sh index 8557f6d81..c845dc26f 100755 --- a/simple_make.sh +++ b/simple_make.sh @@ -2,12 +2,12 @@ if which apt-get; then sudo apt-get install build-essential qt5-qmake qt5-default libopenal-dev libopencv-dev \ - libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev qttools5-dev-tools qtchooser libxss-dev libqt5svg5* + libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev qttools5-dev-tools qtchooser libxss-dev libqt5svg5* qrencode elif which pacman; then - sudo pacman -S --needed base-devel qt5 opencv openal opus libvpx libxss qt5-svg + sudo pacman -S --needed base-devel qt5 opencv openal opus libvpx libxss qt5-svg qrencode elif which yum; then sudo yum groupinstall "Development Tools" - sudo yum install qt-devel qt-doc qt-creator opencv-devel openal-soft-devel libtool autoconf automake check check-devel libXScrnSaver-devel qt5-qtsvg + sudo yum install qt-devel qt-doc qt-creator opencv-devel openal-soft-devel libtool autoconf automake check check-devel libXScrnSaver-devel qt5-qtsvg qrencode else echo "Unknown package manager, attempting to compile anyways" fi From 8eb1a6fdb1fbf960de08a1179b3fca9557280345 Mon Sep 17 00:00:00 2001 From: agilob Date: Sat, 7 Mar 2015 20:29:39 +0000 Subject: [PATCH 04/11] tox URI and updated install.md --- INSTALL.md | 10 ++++++---- src/misc/qrwidget.cpp | 13 ++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index a0d4680de..5d835211a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -59,22 +59,22 @@ git clone https://github.com/tux3/qTox.git qTox The following steps assumes that you cloned the repository at "/home/user/qTox". If you decided to choose another location, replace corresponding parts. -###GCC, Qt, OpenCV and OpanAL Soft +###GCC, Qt, OpenCV, OpanAL Soft and QRCode Arch Linux: ```bash -sudo pacman -S --needed base-devel qt5 opencv openal libxss +sudo pacman -S --needed base-devel qt5 opencv openal libxss qrencode ``` Debian / Ubuntu: ```bash -sudo apt-get install build-essential qt5-qmake qt5-default qttools5-dev-tools libqt5opengl5-dev libqt5svg5-dev libopenal-dev libopencv-dev libxss-dev +sudo apt-get install build-essential qt5-qmake qt5-default qttools5-dev-tools libqt5opengl5-dev libqt5svg5-dev libopenal-dev libopencv-dev libxss-dev qrencode ``` Fedora: ```bash yum groupinstall "Development Tools" -yum install qt-devel qt-doc qt-creator qt5-qtsvg opencv-devel openal-soft-devel libXScrnSaver-devel +yum install qt-devel qt-doc qt-creator qt5-qtsvg opencv-devel openal-soft-devel libXScrnSaver-devel qrencode ``` Slackware: @@ -87,6 +87,8 @@ http://slackbuilds.org/repository/14.1/libraries/qt5/ http://slackbuilds.org/repository/14.1/libraries/opencv/ +http://slackbuilds.org/slackbuilds/14.1/graphics/qrencode/ + ###Tox Core diff --git a/src/misc/qrwidget.cpp b/src/misc/qrwidget.cpp index 19ff2b42c..cffb14804 100644 --- a/src/misc/qrwidget.cpp +++ b/src/misc/qrwidget.cpp @@ -7,7 +7,8 @@ #include "qrencode.h" QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0") -//Note: The encoding fails with empty string so I just default to something else. Use the setQRData() call to change this. +//Note: The encoding fails with empty string so I just default to something else. +//Use the setQRData() call to change this. { //size of the qimage might be problematic in the future, but it works for me size.setWidth(480); @@ -17,7 +18,7 @@ QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0") void QRWidget::setQRData(QString data) { - this->data = data; + this->data = "tox:" + data; paintImage(); } @@ -30,7 +31,8 @@ QString QRWidget::getImageAsText() image->save(&buffer, "PNG"); // writes the image in PNG format inside the buffer QString iconBase64 = QString::fromLatin1(ba.toBase64().data()); - QString base64Image = ""; + QString base64Image = ""; + qDebug() << base64Image; return QString(base64Image); } @@ -40,7 +42,8 @@ void QRWidget::paintImage() { QPainter painter(image); //NOTE: I have hardcoded some parameters here that would make more sense as variables. - QRcode *qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 0); + // ECLEVEL_M is much faster recognizable by barcodescanner any any other type + QRcode *qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_M, QR_MODE_8, 0); if(0 != qr) { @@ -50,7 +53,7 @@ void QRWidget::paintImage() painter.setPen(Qt::NoPen); painter.drawRect(0, 0, size.width(), size.height()); painter.setBrush(fg); - const int s = qr->width>0 ? qr->width : 1; + const int s = qr->width > 0 ? qr->width : 1; const double w = width(); const double h = height(); const double aspect = w / h; From fd374fa7c4f5ed768c8f9af287e66e42594b37b7 Mon Sep 17 00:00:00 2001 From: agilob Date: Sun, 8 Mar 2015 14:20:15 +0000 Subject: [PATCH 05/11] allow saving qrcode as file (src only, no UI) --- src/misc/qrwidget.cpp | 18 ++++++++++++++++-- src/misc/qrwidget.h | 2 ++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/misc/qrwidget.cpp b/src/misc/qrwidget.cpp index cffb14804..10e971af0 100644 --- a/src/misc/qrwidget.cpp +++ b/src/misc/qrwidget.cpp @@ -19,7 +19,22 @@ QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0") void QRWidget::setQRData(QString data) { this->data = "tox:" + data; - paintImage(); + paintImage(); +} + +QImage* QRWidget::getImage() +{ + return image; +} + +/** + * @brief QRWidget::saveImage + * @param path Full path to the file with extension. + * @return indicate if saving was successful. + */ +bool QRWidget::saveImage(QString path) +{ + return image->save(path, 0, 75); //0 - image format same as file extension, 75-quality, png file is ~6.3kb } QString QRWidget::getImageAsText() @@ -32,7 +47,6 @@ QString QRWidget::getImageAsText() QString iconBase64 = QString::fromLatin1(ba.toBase64().data()); QString base64Image = ""; - qDebug() << base64Image; return QString(base64Image); } diff --git a/src/misc/qrwidget.h b/src/misc/qrwidget.h index 10454a65c..75674da6c 100644 --- a/src/misc/qrwidget.h +++ b/src/misc/qrwidget.h @@ -13,6 +13,8 @@ public: explicit QRWidget(QWidget *parent = 0); void setQRData(QString data); QString getImageAsText(); + QImage* getImage(); + bool saveImage(QString path); private: QString data; From 231948291136d0df3384981c7fad9256ebdfc3d6 Mon Sep 17 00:00:00 2001 From: agilob Date: Mon, 9 Mar 2015 19:45:06 +0000 Subject: [PATCH 06/11] install.md dependency --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 5d835211a..78391c9cc 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ | OpenCV | >= 2.4.9 | core, highgui, imgproc | | OpenAL Soft | >= 1.16.0 | | | filter_audio | most recent | | - +| qrcode | most recent | | ##Linux From 7432f8d00754fb25a7bd7b645a4cbdeb69135605 Mon Sep 17 00:00:00 2001 From: agilob Date: Sat, 14 Mar 2015 08:24:43 +0000 Subject: [PATCH 07/11] s/qrcode/qrencode/ --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 78391c9cc..99f38c4f8 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ | OpenCV | >= 2.4.9 | core, highgui, imgproc | | OpenAL Soft | >= 1.16.0 | | | filter_audio | most recent | | -| qrcode | most recent | | +| qrencode | => 3.0.3 | | ##Linux From 0bf15013e522e092fdcc2712d28af5915ebc28d4 Mon Sep 17 00:00:00 2001 From: agilob Date: Sat, 14 Mar 2015 08:30:52 +0000 Subject: [PATCH 08/11] s/=>/>=/ --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 99f38c4f8..831d3c3fa 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ | OpenCV | >= 2.4.9 | core, highgui, imgproc | | OpenAL Soft | >= 1.16.0 | | | filter_audio | most recent | | -| qrencode | => 3.0.3 | | +| qrencode | >= 3.0.3 | | ##Linux From 9d99007e2c04520fcb9379f30013c143cd76c9d6 Mon Sep 17 00:00:00 2001 From: agilob Date: Sun, 15 Mar 2015 15:45:28 +0000 Subject: [PATCH 09/11] qrcode always visible, button to save --- src/widget/form/profileform.cpp | 46 +++++++++++++++++++++------ src/widget/form/profileform.h | 9 ++++-- src/widget/form/profileform.ui | 56 ++++++++++++++++++++++++++++++--- 3 files changed, 95 insertions(+), 16 deletions(-) diff --git a/src/widget/form/profileform.cpp b/src/widget/form/profileform.cpp index 13bed0761..fc8b24fc5 100644 --- a/src/widget/form/profileform.cpp +++ b/src/widget/form/profileform.cpp @@ -27,8 +27,6 @@ #include "src/widget/gui.h" #include "src/historykeeper.h" #include "src/misc/style.h" -#include "src/misc/qrwidget.h" -#include "qrencode.h" #include #include #include @@ -38,7 +36,6 @@ #include #include - void ProfileForm::refreshProfiles() { bodyUI->profiles->clear(); @@ -78,9 +75,11 @@ ProfileForm::ProfileForm(QWidget *parent) : toxId->setReadOnly(true); toxId->setFrame(false); toxId->setFont(Style::getFont(Style::Small)); + + QVBoxLayout *toxIdGroup = qobject_cast(bodyUI->toxGroup->layout()); + toxIdGroup->replaceWidget(bodyUI->toxId, toxId); + bodyUI->toxId->hide(); - bodyUI->toxGroup->layout()->addWidget(toxId); - profilePicture = new MaskablePixmapWidget(this, QSize(64, 64), ":/img/avatar_mask.png"); profilePicture->setPixmap(QPixmap(":/img/contact_dark.png")); profilePicture->setClickable(true); @@ -172,10 +171,10 @@ void ProfileForm::setToxId(const QString& id) toxId->setText(id); toxId->setCursorPosition(0); - QRWidget *qrcode = new QRWidget(); - qrcode->setQRData(id); - - toxId->setToolTip(qrcode->getImageAsText()); + qr = new QRWidget(); + qr->setQRData(id); + bodyUI->qrCode->setPixmap(QPixmap::fromImage(qr->getImage()->scaledToWidth(150))); + bodyUI->qrCode->setToolTip(qr->getImageAsText()); } void ProfileForm::onAvatarClicked() @@ -376,3 +375,32 @@ void ProfileForm::showEvent(QShowEvent *event) refreshProfiles(); QWidget::showEvent(event); } + +void ProfileForm::on_copyQr_clicked() +{ + +} + +void ProfileForm::on_saveQr_clicked() +{ + QString current = bodyUI->profiles->currentText() + ".png"; + QString path = QFileDialog::getSaveFileName(0, tr("Save", "save qr image"), + QDir::home().filePath(current), + tr("Save QrCode (*.png)", "save dialog filter")); + if (!path.isEmpty()) + { + bool success; + if (QFile::exists(path)) + { + success = QFile::remove(path); + if (!success) + { + QMessageBox::warning(this, tr("Failed to remove file"), tr("The file you chose to overwrite could not be removed first.")); + return; + } + } + success = qr->saveImage(path); + if (!success) + QMessageBox::warning(this, tr("Failed to copy file"), tr("The file you chose could not be written to.")); + } +} diff --git a/src/widget/form/profileform.h b/src/widget/form/profileform.h index 830e486db..82cd829ef 100644 --- a/src/widget/form/profileform.h +++ b/src/widget/form/profileform.h @@ -22,6 +22,7 @@ #include #include #include "src/core.h" +#include "src/misc/qrwidget.h" class CroppingLabel; class Core; @@ -36,7 +37,7 @@ class ClickableTE : public QLineEdit { Q_OBJECT public: - + signals: void clicked(); protected: @@ -73,7 +74,10 @@ private slots: void onNewClicked(); void disableSwitching(); void enableSwitching(); - + void on_copyQr_clicked(); + + void on_saveQr_clicked(); + protected: virtual void showEvent(QShowEvent *); @@ -85,6 +89,7 @@ private: Core* core; QTimer timer; bool hasCheck = false; + QRWidget *qr; ClickableTE* toxId; }; diff --git a/src/widget/form/profileform.ui b/src/widget/form/profileform.ui index 58633511a..812a9d077 100644 --- a/src/widget/form/profileform.ui +++ b/src/widget/form/profileform.ui @@ -6,8 +6,8 @@ 0 0 - 439 - 472 + 442 + 659 @@ -39,8 +39,8 @@ 0 0 - 419 - 452 + 422 + 639 @@ -97,6 +97,52 @@ Share it with your friends to communicate. + + + + + + + + + + QRCODE + + + Qt::AlignCenter + + + + + + + + + + Share this code, so friends can add you + + + + + + + Save + + + + + + + Copy + + + + + + + + + @@ -212,7 +258,7 @@ Profile does not contain your history. CroppingLabel QLabel -
src/widget/croppinglabel.h
+
src/widget/croppinglabel.h
From 42133a3d006601c54a03a70371f3254975b19052 Mon Sep 17 00:00:00 2001 From: agilob Date: Sun, 15 Mar 2015 18:53:10 +0000 Subject: [PATCH 10/11] copy image to clipboard --- src/widget/form/profileform.cpp | 2 +- src/widget/form/profileform.ui | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget/form/profileform.cpp b/src/widget/form/profileform.cpp index fc8b24fc5..e87fc50a1 100644 --- a/src/widget/form/profileform.cpp +++ b/src/widget/form/profileform.cpp @@ -378,7 +378,7 @@ void ProfileForm::showEvent(QShowEvent *event) void ProfileForm::on_copyQr_clicked() { - + QApplication::clipboard()->setImage(*qr->getImage()); } void ProfileForm::on_saveQr_clicked() diff --git a/src/widget/form/profileform.ui b/src/widget/form/profileform.ui index 812a9d077..0b02d718a 100644 --- a/src/widget/form/profileform.ui +++ b/src/widget/form/profileform.ui @@ -126,14 +126,14 @@ Share it with your friends to communicate. - Save + Save image - Copy + Copy image From f72a5b0d85deb2c3e99d5097db19763a88314c27 Mon Sep 17 00:00:00 2001 From: agilob Date: Mon, 16 Mar 2015 19:38:05 +0000 Subject: [PATCH 11/11] rm qrcodewindow --- src/misc/qrwidget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/misc/qrwidget.cpp b/src/misc/qrwidget.cpp index 10e971af0..0ee1d0c0d 100644 --- a/src/misc/qrwidget.cpp +++ b/src/misc/qrwidget.cpp @@ -3,7 +3,6 @@ #include #include #include -#include "qrcodewindow.h" #include "qrencode.h" QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0")