#include #include "VView.h" #include "VComboBox.h" #include "VSmallView.h" VView::VView(): fCurScaleX(1.), fCurScaleY(1.), fMaxScale(64.), fMinScale(0.1), fScaleFactor(1.1), fMouseMovable(false) { createActions(); createWidgets(); createToolBar(); } /* VView::~VView() { } */ void VView::setScene(QGraphicsScene * scene) { QGraphicsView::setScene(scene); fSmallView->setScene(scene); fSmallView->fitSceneToView(); viewChanged(); } void VView::setVisibleRect(const QRectF & rect) { ensureVisible(rect, 0, 0); } void VView::zoomIn() { if ( (fCurScaleX < fMaxScale) && (fCurScaleY < fMaxScale) ) { fCurScaleX *= fScaleFactor; fCurScaleY *= fScaleFactor; } applyScale(); } void VView::zoomOut() { if ( (fCurScaleX > fMinScale) && (fCurScaleY > fMinScale) ) { fCurScaleX /= fScaleFactor; fCurScaleY /= fScaleFactor; } applyScale(); } void VView::zoom100() { fCurScaleX = 1.; fCurScaleY = 1.; this->resetMatrix(); fZoomComboBox->setEditText(QString("%1 %").arg(int(fCurScaleX * 100))); viewChanged(); } void VView::onOffSmallView() { fSmallView->setVisible(!fSmallView->isVisible()); } void VView::setScale(const QString& text) { QString text1 = text; if (text1.endsWith("%")) { text1.remove(text1.length() - 1, 1); } int scale = text1.toInt(); if (scale != 0){ if ( scale >= (fMaxScale * 100) ) { scale = fMaxScale * 100; } if ( scale <= (fMinScale * 100) ) { scale = fMinScale * 100; } fCurScaleX = fCurScaleY = scale / 100.; } applyScale(); } void VView::applyScale() { QMatrix matrix; matrix.scale(fCurScaleX, fCurScaleY); this->setMatrix(matrix); fZoomComboBox->setEditText(QString("%1 %").arg(int(fCurScaleX * 100))); viewChanged(); } void VView::viewChanged() { QRect rect = QRect(0, 0, width(), height()); QRectF rect1 = QRectF(mapToScene(rect).boundingRect()); emit viewChanged(rect1); } void VView::mousePressEvent(QMouseEvent *event) { QGraphicsView::mousePressEvent(event); if (event->button() == Qt::LeftButton) { // setCursor(Qt::ClosedHandCursor); fMousePos = event->pos(); fScrollValueY = this->verticalScrollBar()->value(); fScrollValueX = this->horizontalScrollBar()->value(); fMouseMovable = true; } } void VView::mouseMoveEvent(QMouseEvent *event) { QGraphicsView::mouseMoveEvent(event); if (fMouseMovable){ QPoint curMousePos = event->pos(); QPoint d = fMousePos - curMousePos; this->verticalScrollBar()->setValue(fScrollValueY + d.y()); this->horizontalScrollBar()->setValue(fScrollValueX + d.x()); viewChanged(); } } void VView::mouseReleaseEvent(QMouseEvent *event) { QGraphicsView::mouseReleaseEvent(event); if (event->button() == Qt::LeftButton) { // setCursor(Qt::OpenHandCursor); fMouseMovable = false; } } void VView::wheelEvent(QWheelEvent *event) { //QGraphicsView::wheelEvent(event); if (event->delta() > 0) zoomIn(); else if (event->delta() < 0) zoomOut(); } void VView::createActions() { fZoomInAct = new QAction(QIcon(":/images/zoomin.png"),tr("zoom in"), this); fZoomInAct->setShortcut(tr("Ctrl++")); fZoomInAct->setStatusTip(tr("zoom in")); connect(fZoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn())); fZoomOutAct = new QAction(QIcon(":/images/zoomout.png"),tr("zoom out"), this); fZoomOutAct->setShortcut(tr("Ctrl+-")); fZoomOutAct->setStatusTip(tr("zoom out")); connect(fZoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut())); fZoom100Act = new QAction(QIcon(":/images/pictures.png"),tr("zoom 100%"), this); fZoom100Act->setShortcut(tr("Ctrl+0")); fZoom100Act->setStatusTip(tr("zoom 100%")); connect(fZoom100Act, SIGNAL(triggered()), this, SLOT(zoom100())); fOnOffSmallViewAct = new QAction(QIcon(":/images/window.png"),tr("switch on/off small view"), this); fOnOffSmallViewAct->setShortcut(tr("Ctrl+1")); fOnOffSmallViewAct->setStatusTip(tr("switch on/off small view")); connect(fOnOffSmallViewAct, SIGNAL(triggered()), this, SLOT(onOffSmallView()));; } void VView::createWidgets() { fSmallView = new VSmallView(this); fSmallView->setBackgroundBrush(QBrush(Qt::darkGray)); fSmallView->setGeometry(QRect(10, 40, 200, 200)); fSmallView->setVisible(false); connect(fSmallView, SIGNAL(rectChanged(const QRectF &)), this, SLOT(setVisibleRect(const QRectF &))); connect(this, SIGNAL(viewChanged(const QRectF &)), fSmallView, SLOT(updateFrame(const QRectF &))); connect(this->verticalScrollBar(), SIGNAL(sliderMoved(int)), this, SLOT(viewChanged())); connect(this->horizontalScrollBar(), SIGNAL(sliderMoved(int)), this, SLOT(viewChanged())); } void VView::createToolBar() { fZoomComboBox = new VComboBox; fZoomComboBox->setEditable(true); fZoomComboBox->setInsertPolicy(QComboBox::NoInsert); fZoomComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); fZoomComboBox->insertItem(0, tr("25 %")); fZoomComboBox->insertItem(1, tr("50 %")); fZoomComboBox->insertItem(2, tr("75 %")); fZoomComboBox->insertItem(3, tr("100 %")); fZoomComboBox->insertItem(4, tr("200 %")); fZoomComboBox->insertItem(5, tr("400 %")); fZoomComboBox->insertItem(6, tr("800 %")); fZoomComboBox->insertItem(7, tr("1600 %")); fZoomComboBox->insertItem(8, tr("3200 %")); fZoomComboBox->insertItem(9, tr("6400 %")); fZoomComboBox->setEditText(QString("%1 %").arg(int(fCurScaleX * 100))); connect(fZoomComboBox, SIGNAL(activated(const QString &)), this, SLOT(setScale(const QString&))); connect(fZoomComboBox, SIGNAL(editingFinished(const QString &)), this, SLOT(setScale(const QString&))); fToolBar = new QToolBar(this); fToolBar->addAction(fZoomInAct); fToolBar->addAction(fZoomOutAct); fToolBar->addAction(fZoom100Act); fToolBar->addAction(fOnOffSmallViewAct); fToolBar->addWidget(fZoomComboBox); }