ui: Check for !pixmap() before trying to export QR code

Adds null pointer checks as well as prevents the Save/Copy context
menu from appearing at all if no image is shown.

Fixes issue #4140
This commit is contained in:
Wladimir J. van der Laan 2014-05-07 08:15:22 +02:00
parent 13d3adb651
commit 9d558e1c18
2 changed files with 26 additions and 6 deletions

View file

@ -16,6 +16,7 @@
#include <QMimeData> #include <QMimeData>
#include <QMouseEvent> #include <QMouseEvent>
#include <QPixmap> #include <QPixmap>
#include <QMenu>
#if QT_VERSION < 0x050000 #if QT_VERSION < 0x050000
#include <QUrl> #include <QUrl>
#endif #endif
@ -29,26 +30,27 @@
#endif #endif
QRImageWidget::QRImageWidget(QWidget *parent): QRImageWidget::QRImageWidget(QWidget *parent):
QLabel(parent) QLabel(parent), contextMenu(0)
{ {
setContextMenuPolicy(Qt::ActionsContextMenu); contextMenu = new QMenu();
QAction *saveImageAction = new QAction(tr("&Save Image..."), this); QAction *saveImageAction = new QAction(tr("&Save Image..."), this);
connect(saveImageAction, SIGNAL(triggered()), this, SLOT(saveImage())); connect(saveImageAction, SIGNAL(triggered()), this, SLOT(saveImage()));
addAction(saveImageAction); contextMenu->addAction(saveImageAction);
QAction *copyImageAction = new QAction(tr("&Copy Image"), this); QAction *copyImageAction = new QAction(tr("&Copy Image"), this);
connect(copyImageAction, SIGNAL(triggered()), this, SLOT(copyImage())); connect(copyImageAction, SIGNAL(triggered()), this, SLOT(copyImage()));
addAction(copyImageAction); contextMenu->addAction(copyImageAction);
} }
QImage QRImageWidget::exportImage() QImage QRImageWidget::exportImage()
{ {
if(!pixmap())
return QImage();
return pixmap()->toImage().scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE); return pixmap()->toImage().scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE);
} }
void QRImageWidget::mousePressEvent(QMouseEvent *event) void QRImageWidget::mousePressEvent(QMouseEvent *event)
{ {
if(event->button() == Qt::LeftButton) if(event->button() == Qt::LeftButton && pixmap())
{ {
event->accept(); event->accept();
QMimeData *mimeData = new QMimeData; QMimeData *mimeData = new QMimeData;
@ -64,6 +66,8 @@ void QRImageWidget::mousePressEvent(QMouseEvent *event)
void QRImageWidget::saveImage() void QRImageWidget::saveImage()
{ {
if(!pixmap())
return;
QString fn = GUIUtil::getSaveFileName(this, tr("Save QR Code"), QString(), tr("PNG Image (*.png)"), NULL); QString fn = GUIUtil::getSaveFileName(this, tr("Save QR Code"), QString(), tr("PNG Image (*.png)"), NULL);
if (!fn.isEmpty()) if (!fn.isEmpty())
{ {
@ -73,9 +77,18 @@ void QRImageWidget::saveImage()
void QRImageWidget::copyImage() void QRImageWidget::copyImage()
{ {
if(!pixmap())
return;
QApplication::clipboard()->setImage(exportImage()); QApplication::clipboard()->setImage(exportImage());
} }
void QRImageWidget::contextMenuEvent(QContextMenuEvent *event)
{
if(!pixmap())
return;
contextMenu->exec(event->globalPos());
}
ReceiveRequestDialog::ReceiveRequestDialog(QWidget *parent) : ReceiveRequestDialog::ReceiveRequestDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::ReceiveRequestDialog), ui(new Ui::ReceiveRequestDialog),

View file

@ -15,6 +15,9 @@ namespace Ui {
class ReceiveRequestDialog; class ReceiveRequestDialog;
} }
class OptionsModel; class OptionsModel;
QT_BEGIN_NAMESPACE
class QMenu;
QT_END_NAMESPACE
/* Label widget for QR code. This image can be dragged, dropped, copied and saved /* Label widget for QR code. This image can be dragged, dropped, copied and saved
* to disk. * to disk.
@ -33,6 +36,10 @@ public slots:
protected: protected:
virtual void mousePressEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event);
virtual void contextMenuEvent(QContextMenuEvent *event);
private:
QMenu *contextMenu;
}; };
class ReceiveRequestDialog : public QDialog class ReceiveRequestDialog : public QDialog