From f768fba3a05c9d6f36fdc49a05605c3642a969db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Wed, 24 Oct 2018 11:29:26 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@452 a8b55f48-bf90-11e4-a774-851b48703e85 --- qad/widgets/image_view.cpp | 133 +++++++++++++++++++++++++ qad/widgets/image_view.h | 46 +++++++++ qad/widgets/plugin/imageviewplugin.cpp | 69 +++++++++++++ qad/widgets/plugin/imageviewplugin.h | 36 +++++++ qad/widgets/plugin/qad_widgets.cpp | 2 + 5 files changed, 286 insertions(+) create mode 100644 qad/widgets/image_view.cpp create mode 100644 qad/widgets/image_view.h create mode 100644 qad/widgets/plugin/imageviewplugin.cpp create mode 100644 qad/widgets/plugin/imageviewplugin.h diff --git a/qad/widgets/image_view.cpp b/qad/widgets/image_view.cpp new file mode 100644 index 0000000..9494fec --- /dev/null +++ b/qad/widgets/image_view.cpp @@ -0,0 +1,133 @@ +#include "image_view.h" +#include +#include +#include +#include +#include +#include +#include + + +ImageView::ImageView(QWidget * parent): QGraphicsView(parent) { + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setDragMode(QGraphicsView::NoDrag); + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + setScene(new QGraphicsScene()); + item.setTransformationMode(Qt::SmoothTransformation); + item.setFlags(0); + scene()->addItem(&item); + viewport()->installEventFilter(this); + autofit_ = true; +} + + +ImageView::~ImageView() { +} + + +QPixmap ImageView::pixmap() const { + return item.pixmap(); +} + + +void ImageView::setPixmap(QPixmap pixmap) { + item.setPixmap(pixmap); + adjustView(); +} + + +void ImageView::setImage(const QImage & i) { + im_data.clear(); + if (i.isNull()) { + item.setPixmap(QPixmap()); + return; + } + QBuffer b(&im_data); b.open(QIODevice::ReadWrite); + i.save(&b, "png"); + b.close(); + item.setPixmap(QPixmap::fromImage(i)); + adjustView(); +} + + +void ImageView::setImage(const QByteArray & i) { + im_data = i; + if (i.isEmpty()) { + item.setPixmap(QPixmap()); + return; + } + item.setPixmap(QPixmap::fromImage(QImage::fromData(i))); + adjustView(); + +} + + +void ImageView::clear() { + im_data.clear(); + item.setPixmap(QPixmap()); +} + + +void ImageView::mouseDoubleClickEvent(QMouseEvent * e) { + autofit(); +} + + +void ImageView::mousePressEvent(QMouseEvent * e) { + QGraphicsView::mousePressEvent(e); + emit clicked(mapToScene(e->pos()), e->buttons()); +} + + +void ImageView::mouseMoveEvent(QMouseEvent * e) { + //if (e->buttons().testFlag(Qt::RightButton) && !autofit_ && isInteractive()) return;; + QGraphicsView::mouseMoveEvent(e); +} + + +void ImageView::wheelEvent(QWheelEvent * e) { + if (!e->modifiers().testFlag(Qt::ControlModifier) || !isInteractive()) return; + double scl = 1. + e->delta() / 500.; + //autofit_ = false; + //scale(scl, scl); +} + + +bool ImageView::eventFilter(QObject * o, QEvent * e) { + QMouseEvent * me = (QMouseEvent *)e; + switch (e->type()) { + case QEvent::Resize: + adjustView(); + break; + case QEvent::MouseButtonPress: + prev_pos = me->pos(); + break; + case QEvent::MouseMove: + if (!me->buttons().testFlag(Qt::RightButton) || autofit_ || !isInteractive()) break; + { + double scl = 1. / qSqrt(transform().determinant()); + QPointF dp = QPointF(me->pos() - prev_pos) * scl; + //qDebug() << dp; + //translate(0.00001, 0); + prev_pos = me->pos(); + } + break; + default: break; + } + return QGraphicsView::eventFilter(o, e); +} + + +void ImageView::adjustView() { + if (!autofit_) return; + setSceneRect(item.boundingRect()); + fitInView(&item, Qt::KeepAspectRatio); + centerOn(&item); +} + + +void ImageView::autofit() { + autofit_ = true; + adjustView(); +} diff --git a/qad/widgets/image_view.h b/qad/widgets/image_view.h new file mode 100644 index 0000000..475b799 --- /dev/null +++ b/qad/widgets/image_view.h @@ -0,0 +1,46 @@ +#ifndef IMAGE_VIEW_H +#define IMAGE_VIEW_H + +#include +#include + + +class ImageView: public QGraphicsView +{ + Q_OBJECT + Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap) +public: + ImageView(QWidget * parent = 0); + ~ImageView(); + + void setImage(const QImage & i); + void setImage(const QByteArray & i); + QByteArray image() const {return im_data;} + QPixmap pixmap() const; + + void clear(); + +private: + void mouseDoubleClickEvent(QMouseEvent * e); + void mousePressEvent(QMouseEvent * e); + void mouseMoveEvent(QMouseEvent * e); + void wheelEvent(QWheelEvent * e); + bool eventFilter(QObject * o, QEvent * e); + void adjustView(); + + QGraphicsPixmapItem item; + QByteArray im_data; + QPoint prev_pos; + bool autofit_; + + +public slots: + void autofit(); + void setPixmap(QPixmap pixmap); + +signals: + void clicked(QPointF, Qt::MouseButtons); + +}; + +#endif // IMAGE_VIEW_H diff --git a/qad/widgets/plugin/imageviewplugin.cpp b/qad/widgets/plugin/imageviewplugin.cpp new file mode 100644 index 0000000..f20adc9 --- /dev/null +++ b/qad/widgets/plugin/imageviewplugin.cpp @@ -0,0 +1,69 @@ +#include "image_view.h" +#include "imageviewplugin.h" +#include + + +ImageViewPlugin::ImageViewPlugin(QObject * parent): QObject(parent) { + m_initialized = false; +} + + +void ImageViewPlugin::initialize(QDesignerFormEditorInterface * /* core */) { + if (m_initialized) + return; + + // Add extension registrations, etc. here + + m_initialized = true; +} + + +bool ImageViewPlugin::isInitialized() const { + return m_initialized; +} + + +QWidget * ImageViewPlugin::createWidget(QWidget * parent) { + return new ImageView(parent); +} + + +QString ImageViewPlugin::name() const { + return QLatin1String("ImageView"); +} + + +QString ImageViewPlugin::group() const { + return QLatin1String("Display Widgets"); +} + + +QIcon ImageViewPlugin::icon() const { + return QIcon(/*":/icons/spinslider.png"*/); +} + + +QString ImageViewPlugin::toolTip() const { + return QLatin1String("Image viewer"); +} + + +QString ImageViewPlugin::whatsThis() const { + return QLatin1String("Image viewer"); +} + + +bool ImageViewPlugin::isContainer() const { + return false; +} + + +QString ImageViewPlugin::domXml() const { + return QLatin1String("\n\n"); +} + + +QString ImageViewPlugin::includeFile() const { + return QLatin1String("image_view.h"); +} + diff --git a/qad/widgets/plugin/imageviewplugin.h b/qad/widgets/plugin/imageviewplugin.h new file mode 100644 index 0000000..cc7a704 --- /dev/null +++ b/qad/widgets/plugin/imageviewplugin.h @@ -0,0 +1,36 @@ +#ifndef IMAGEVIEWPLUGIN_H +#define IMAGEVIEWPLUGIN_H + +#include +#if QT_VERSION >= 0x050000 +# include +#else +# include +#endif + +class ImageViewPlugin: public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + ImageViewPlugin(QObject * parent = 0); + + bool isContainer() const; + bool isInitialized() const; + QIcon icon() const; + QString domXml() const; + QString group() const; + QString includeFile() const; + QString name() const; + QString toolTip() const; + QString whatsThis() const; + QWidget * createWidget(QWidget * parent); + void initialize(QDesignerFormEditorInterface * core); + +private: + bool m_initialized; + +}; + +#endif diff --git a/qad/widgets/plugin/qad_widgets.cpp b/qad/widgets/plugin/qad_widgets.cpp index d1ab93e..257bd37 100644 --- a/qad/widgets/plugin/qad_widgets.cpp +++ b/qad/widgets/plugin/qad_widgets.cpp @@ -14,6 +14,7 @@ #include "qvarianteditplugin.h" #include "qpiconfigplugin.h" #include "evalspinboxplugin.h" +#include "imageviewplugin.h" QADWidgets::QADWidgets(QObject * parent): QObject(parent) { @@ -32,6 +33,7 @@ QADWidgets::QADWidgets(QObject * parent): QObject(parent) { m_widgets.append(new QVariantEditPlugin(this)); m_widgets.append(new QPIConfigPlugin(this)); m_widgets.append(new EvalSpinBoxPlugin(this)); + m_widgets.append(new ImageViewPlugin(this)); }