1 #include "mainwindow.h"
2 #include "simpleimageview.h"
7 #include <QContextMenuEvent>
8 #include <QResizeEvent>
12 ///////////////////////////////////////////////////////////////////////////////
13 /// \brief SimpleImageView::SimpleImageView
14 /// \param parent 親ウィジェット
18 SimpleImageView::SimpleImageView(QWidget *parent) :
19 QGraphicsView(parent),
26 setContextMenuPolicy(Qt::NoContextMenu);
27 setDragMode(ScrollHandDrag);
31 ///////////////////////////////////////////////////////////////////////////////
32 /// \brief SimpleImageView::initialize
33 /// \param w メインウィンドウオブジェクト
37 void SimpleImageView::initialize(MainWindow *w)
39 connect(this, SIGNAL(statusChanged(QString)), w, SLOT(view_statusChanged(QString)));
40 installEventFilter(w);
43 ///////////////////////////////////////////////////////////////////////////////
44 /// \brief SimpleImageView::setSource
47 void SimpleImageView::setSource(const QPixmap &pixmap)
49 qDebug() << "SimpleImageView::setSource()";
58 ///////////////////////////////////////////////////////////////////////////////
59 /// \brief SimpleImageView::scaleFactor
62 double SimpleImageView::scaleFactor()
64 // すでに倍率が指定されている場合は、そのまま。
65 if (m_scaleFactor > 0) {
69 // ビューポートに対する適切な倍率を計算する
70 double scaleFactor, scaleX, scaleY;
71 if (m_rotateDeg == 90 || m_rotateDeg == 270) {
72 scaleX = 1.0 * viewport()->width() / m_imgSrc.height();
73 scaleY = 1.0 * viewport()->height() / m_imgSrc.width();
76 scaleX = 1.0 * viewport()->width() / m_imgSrc.width();
77 scaleY = 1.0 * viewport()->height() / m_imgSrc.height();
79 scaleFactor = (scaleX > scaleY) ? scaleY : scaleX;
82 if (m_scaleFactor == -1) {
83 return (scaleFactor > 1) ? 1 : scaleFactor;
89 ///////////////////////////////////////////////////////////////////////////////
90 /// \brief SimpleImageView::sizeChanged
94 void SimpleImageView::sizeChanged()
97 str = tr("%1 x %2 x %3(%4%)")
98 .arg(m_imgSrc.width())
99 .arg(m_imgSrc.height())
100 .arg(m_imgSrc.depth())
101 .arg(int(scaleFactor() * 100));
102 emit statusChanged(str);
105 ///////////////////////////////////////////////////////////////////////////////
106 /// \brief SimpleImageView::resizeImage
109 /// イメージの拡大・縮小と回転を行います。
111 double SimpleImageView::resizeImage()
113 double scaleFactor = this->scaleFactor();
114 QPixmap scaledImg = m_imgSrc.scaled(scaleFactor * m_imgSrc.width(),
115 scaleFactor * m_imgSrc.height(),
116 Qt::IgnoreAspectRatio,
117 Qt::SmoothTransformation);
118 this->scene()->clear();
119 this->scene()->addPixmap(scaledImg);
120 this->setSceneRect(scaledImg.rect());
121 this->setTransform(QTransform());
122 this->translate(width() / 2, height() / 2);
123 this->rotate(m_rotateDeg);
129 ///////////////////////////////////////////////////////////////////////////////
130 /// \brief SimpleImageView::fitToWindow
131 /// \param checked メニューのチェック状態
133 /// ウィンドウへのフィットを切り替えます。
135 void SimpleImageView::fitToWindow(bool checked)
141 double scaleFactor = resizeImage();
144 m_scaleFactor = scaleFactor;
148 ///////////////////////////////////////////////////////////////////////////////
149 /// \brief SimpleImageView::scaleNormal
153 void SimpleImageView::scaleNormal()
159 ///////////////////////////////////////////////////////////////////////////////
160 /// \brief SimpleImageView::rotate90
164 void SimpleImageView::rotate90()
171 ///////////////////////////////////////////////////////////////////////////////
172 /// \brief SimpleImageView::rotate180
176 void SimpleImageView::rotate180()
183 ///////////////////////////////////////////////////////////////////////////////
184 /// \brief SimpleImageView::resizeEvent
187 void SimpleImageView::resizeEvent(QResizeEvent *event)
190 QGraphicsView::resizeEvent(event);
193 ///////////////////////////////////////////////////////////////////////////////
194 /// \brief SimpleImageView::scaleUp
196 void SimpleImageView::scaleUp()
198 m_scaleFactor = scaleFactor() * 1.25;
202 ///////////////////////////////////////////////////////////////////////////////
203 /// \brief SimpleImageView::scaleDown
205 void SimpleImageView::scaleDown()
207 m_scaleFactor = scaleFactor() * 0.8;