SvgView::SvgView(QWidget *parent) : QGraphicsView(parent) { currentScaleFactor = 1.0; maxZoomFactor = 3.0; minZoomFactor = 0.05; changeMargins = false; setTransformationAnchor(QGraphicsView::AnchorUnderMouse); setDragMode(ScrollHandDrag); limitScale(0.3); scene = new QGraphicsScene(); setScene(scene); centerOn(0.0, 0.0); }
void SymbolDataEditor::load(const QString & fileName) { loadSettings(); doc = QDomDocument("SVG"); QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; if (!doc.setContent(&file)) { file.close(); return; } file.close(); //scale viewbox because it is necessary in SvgView::insertSymbol() QDomElement svgElement = doc.elementsByTagName("svg").item(0).toElement(); SvgView::scaleViewBox(svgElement); QByteArray scaledFile = doc.toString(0).replace(">\n<tspan", "><tspan").toUtf8(); QGraphicsSvgItem *symbolItem = new QGraphicsSvgItem(); symbolItem->setSharedRenderer(new QSvgRenderer(scaledFile)); QSizeF itemSize = symbolItem->renderer()->defaultSize(); clear(); //add changed item to the scene scene->setSceneRect(0, 0, itemSize.width() * sceneScale, itemSize.height() * sceneScale); symbolItem->setPos(scene->width() / 2 - itemSize.width() / 2.0, scene->height() / 2 - itemSize.height() / 2.0); scene->addItem(symbolItem); //autoscale graphicsview depending on items and views size limitScale(qMax(qreal(width()) / itemSize.width(), qreal(height()) / itemSize.height()) / currentScaleFactor); centerOn(symbolItem); setDragMode(QGraphicsView::ScrollHandDrag); }
// Применение результатов перемещения границы шкалы void QAxisZoomSvc::axisApplyMove(QPoint evpos,int ax) { // получаем указатель на график QwtPlot *plt = zoom->plot(); // определяем (для удобства) геометрию QRect gc = plt->canvas()->geometry(); // канвы графика QRect gw = plt->axisWidget(ax)->geometry(); // и виджета шкалы // определяем текущее положение курсора относительно канвы // (за вычетом смещений графика) int x = evpos.x() + gw.x() - gc.x() - scb_pxl; int y = evpos.y() + gw.y() - gc.y() - scb_pyt; bool bndCh = false; // пока ничего не изменилось // читаем режим масштабирования QwtChartZoom::QConvType ct = zoom->regim(); // в зависимости от включенного режима выполняем некоторые действия switch (ct) { // режим изменения левой границы case QwtChartZoom::ctAxisHL: { // ограничение на положение курсора справа if (x >= scb_pw) x = scb_pw-1; // вычисляем новую ширину шкалы double wx = scb_wx * (scb_pw - scp_x) / (scb_pw - x); // применяем ограничения wx = limitScale(wx,scb_wx); // вычисляем новую левую границу double xl = scb_xr - wx; // устанавливаем ее для горизонтальной шкалы zoom->isb_x->set(xl,scb_xr); bndCh = true; // изменилась граница break; } // режим изменения правой границы case QwtChartZoom::ctAxisHR: { // ограничение на положение курсора слева if (x <= 0) x = 1; // вычисляем новую ширину шкалы double wx = scb_wx * scp_x / x; // применяем ограничения wx = limitScale(wx,scb_wx); // вычисляем новую правую границу double xr = scb_xl + wx; // устанавливаем ее для горизонтальной шкалы zoom->isb_x->set(scb_xl,xr); bndCh = true; // изменилась граница break; } // режим изменения нижней границы case QwtChartZoom::ctAxisVB: { // ограничение на положение курсора сверху if (y <= 0) y = 1; // вычисляем новую высоту шкалы double hy = scb_hy * scp_y / y; // применяем ограничения hy = limitScale(hy,scb_hy); // вычисляем новую нижнюю границу double yb = scb_yt - hy; // устанавливаем ее для вертикальной шкалы zoom->isb_y->set(yb,scb_yt); bndCh = true; // изменилась граница break; } // режим изменения верхней границы case QwtChartZoom::ctAxisVT: { // ограничение на положение курсора снизу if (y >= scb_ph) y = scb_ph-1; // вычисляем новую высоту шкалы double hy = scb_hy * (scb_ph - scp_y) / (scb_ph - y); // применяем ограничения hy = limitScale(hy,scb_hy); // вычисляем новую верхнюю границу double yt = scb_yb + hy; // устанавливаем ее для вертикальной шкалы zoom->isb_y->set(scb_yb,yt); bndCh = true; // изменилась граница break; } // для прочих режимов ничего не делаем default: ; } // если какя-либо граница изменилась, то перестраиваем график if (bndCh) plt->replot(); }
void SvgView::wheelEvent(QWheelEvent *event) { qreal factor = qPow(1.2, event->delta() / 240.0); limitScale(factor); event->accept(); }
void SymbolDataEditor::wheelEvent(QWheelEvent *event) { qreal factor = qPow(1.2, event->delta() / 240.0); limitScale(factor); event->accept(); }