Download raw (3.9 KB)
#include "draw.h" #include "ui_draw.h" #include <QScrollBar> #include <QDebug> #include <QPainterPath> #include <QCursor> Draw::Draw(QWidget *parent) : QWidget(parent), ui(new Ui::Draw) { ui->setupUi(this); highlightPath = 0; QRect r(0,0,1000, 1000); scene = new QGraphicsScene(r); ui->graphicsView->setScene(scene); pixmap = new QImage(ui->graphicsView->size(), QImage::Format_ARGB32); pixmap->fill(qRgb(255,255,255)); item = 0; QPainterPath p; p.addRect(0,0,120,24); frameItem = scene->addPath(p,Qt::NoPen,Qt::lightGray); frameItem->setZValue(999998.0); coordItem = scene->addText("0 0"); coordItem->setZValue(999999.0); coordItem->setDefaultTextColor(Qt::white); QPen bPen(Qt::blue, 0.5); bPen.setCosmetic(true); horizontalLine = scene->addLine(0,0, scene->width(), 0, bPen); verticalLine = scene->addLine(0,0,0,scene->height(), bPen); horizontalLine->setZValue(99999); verticalLine->setZValue(99999); QPainterPath c; c.lineTo(0,-5); c.moveTo(0,0); c.lineTo(5,0); c.moveTo(0,0); c.lineTo(0,5); c.moveTo(0,0); c.lineTo(-5,0); c.moveTo(0,0); crossItem = scene->addPath(c, QPen(Qt::black, 0), Qt::NoBrush); crossItem->setZValue(999999); highlightItem = scene->addPath(QPainterPath(), QPen(Qt::green, 2, Qt::DashLine), Qt::NoBrush); highlightItem->setZValue(999999); ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop); connect(ui->graphicsView, SIGNAL(posClick(double, double)), this, SIGNAL(posClick(double,double))); connect(ui->graphicsView, SIGNAL(posClick(double, double)), this, SLOT(moveCross(double,double))); connect(ui->graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(moveCoord(int))); connect(ui->graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(moveCoord(int))); connect(ui->graphicsView, SIGNAL(sizeChanged(int)), this, SLOT(moveCoord(int))); connect(ui->graphicsView, SIGNAL(sizeChanged(int)), this, SLOT(updateSize(int))); connect(ui->graphicsView, SIGNAL(posChanged(QPoint)), this, SLOT(updateCoord(QPoint))); ui->graphicsView->ensureVisible(0,0,1,1); ui->graphicsView->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); } Draw::~Draw() { delete ui; } QPainterPath * Draw::getHightlightPath() { if(highlightPath) delete highlightPath; highlightPath = new QPainterPath; return highlightPath; } void Draw::updateScene() { QPointF itemPos; if(item) { itemPos = item->pos(); scene->removeItem(item); delete item; } QPixmap p = QPixmap::fromImage(*pixmap); item = scene->addPixmap(p); item->setPos(itemPos); if(highlightPath) { highlightItem->setPath(*highlightPath); qDebug()<< "HL" << (*highlightPath); } } void Draw::updateSize(int) { delete pixmap; pixmap = new QImage(ui->graphicsView->size(), QImage::Format_ARGB32); emit somethingChange(); } void Draw::moveCross(double x, double y) { crossItem->setPos(x,y); } void Draw::moveCoord(int) { int hsH(ui->graphicsView->horizontalScrollBar()->height()); int vsW(ui->graphicsView->verticalScrollBar()->width()); int x(ui->graphicsView->width() - ( vsW + frameItem->boundingRect().width())); int y(ui->graphicsView->height() - ( hsH + frameItem->boundingRect().height())); frameItem->setPos(ui->graphicsView->mapToScene(x,y)); coordItem->setPos(ui->graphicsView->mapToScene(x,y)); QPoint c(QCursor::pos()); updateCoord(ui->graphicsView->mapFromGlobal(c)); pixmapShift = ui->graphicsView->mapToScene(QPoint(0,0)); if(item) item->setPos(pixmapShift); emit somethingChange(); } void Draw::updateCoord(QPoint pos) { QPointF p(ui->graphicsView->mapToScene(pos)); QString s("<div style=\"text-align:center\"> x:%1 y:%2 </div>"); coordItem->setHtml(s.arg(p.x()).arg(p.y())); verticalLine->setPos(p.x(), 0); horizontalLine->setPos(0,p.y()); } void Draw::sceneRect(double w, double h) { scene->setSceneRect(0, 0, w, h); }