123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- #include "ImageView.h"
- #include <QPainter>
- #include <QDebug>
- #include <QGraphicsPixmapItem>
- #include <QScrollBar>
- #include <QMenu>
- #include <QFileDialog>
- #include <QDateTime>
- #include <QMessageBox>
- #include <QApplication>
- #define VIEW_CENTER viewport()->rect().center()
- #define VIEW_WIDTH viewport()->rect().width()
- #define VIEW_HEIGHT viewport()->rect().height()
- ImageView::ImageView(QWidget* parent) :
- QGraphicsView(parent),
- m_imageOffset(0, 0),
- m_bMouseTranslate(false),
- m_isDrawing(false),
- m_curDrawing(false),
- m_isCreating(false),
- m_currentPathItem(nullptr)
- {
- // m_rubberBand = nullptr;
- m_bRulerState = false;
- m_pRuleLine = nullptr;
- setScene(new QGraphicsScene(this));
- setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
- this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- //������ͼ����
- //setRenderHint(QPainter::SmoothPixmapTransform);
- setRenderHint(QPainter::Antialiasing);
- setMouseTracking(true);
- setDragMode(RubberBandDrag);
- }
- ImageView::~ImageView()
- {
- }
- void ImageView::setPixmap(const QPixmap& newPixmap) {
- this->m_pixmap = newPixmap;
- scene()->clear();
- m_pixmapItem = scene()->addPixmap(m_pixmap);
- m_pixmapItem->setZValue(1);
- QPointF pixmapCenter(m_pixmap.width() / 2.0, m_pixmap.height() / 2.0);
- m_pixmapItem->setPos(-pixmapCenter);
- QRectF sceneRect(-pixmapCenter.x(), -pixmapCenter.y(), m_pixmap.width(), m_pixmap.height());
- scene()->setSceneRect(sceneRect);
- setSceneRect(scene()->itemsBoundingRect());
- this->resize(m_pixmap.width(), m_pixmap.height());
- m_imageOffset = QPoint(0, 0); // ����ͼƬƫ����Ϊ(0, 0)
- setCursor(Qt::ArrowCursor);
- update(); // �����ػ�
- }
- void ImageView::setCurPixmap(const QPixmap& newPixmap) {
- if (this->m_pixmap.isNull()) {
- this->m_pixmap = newPixmap;
- scene()->clear();
- m_pixmapItem = scene()->addPixmap(m_pixmap);
- m_pixmapItem->setZValue(1);
- QPointF pixmapCenter(m_pixmap.width() / 2.0, m_pixmap.height() / 2.0);
- m_pixmapItem->setPos(-pixmapCenter);
- QRectF sceneRect(-pixmapCenter.x(), -pixmapCenter.y(), m_pixmap.width(), m_pixmap.height());
- scene()->setSceneRect(sceneRect);
- setSceneRect(scene()->itemsBoundingRect());
- //this->resize(m_pixmap.width(), m_pixmap.height());
- m_imageOffset = QPoint(0, 0); // ����ͼƬƫ����Ϊ(0, 0)
- setCursor(Qt::ArrowCursor);
- update(); // �����ػ�
- }
- else {
- this->m_pixmap = newPixmap;
- m_pixmapItem->setPixmap(m_pixmap);
- }
- }
- void ImageView::addRuler()
- {
- m_bRulerState = true;
- }
- void ImageView::cancelRuler()
- {
- m_bRulerState = false;
- }
- void ImageView::paintEvent(QPaintEvent* event) {
- QGraphicsView::paintEvent(event);
- QPainter painter(viewport());
- painter.setRenderHint(QPainter::Antialiasing);
- drawCrosshair(painter);
- }
- void ImageView::mousePressEvent(QMouseEvent* event) {
- if (event->button() == Qt::LeftButton) {
- // ��������û�� item ʱ�������ƶ�
- QPointF point = mapToScene(event->pos());
- if (scene()->itemAt(point, transform()) != nullptr
- && scene()->itemAt(point, transform())->type() == QGraphicsPixmapItem::Type) {
- setCursor(Qt::OpenHandCursor);
- m_bMouseTranslate = true;
- m_lastMousePos = event->pos();
- }
- }
- else if (event->button() == Qt::RightButton) {
- m_rightClickPressPos = event->pos();
- m_rightButtonPressed = true;
- if (m_bRulerState) {
- if (!m_isCreating) {
- // ��һ�ε������ʼ����
- m_isCreating = true;
- m_startPos = mapToScene(event->pos());
- m_pTempLine = scene()->addLine(QLineF(m_startPos, m_startPos),
- QPen(Qt::gray, 1, Qt::DashLine));
- m_pTempLine->setZValue(2);
- }
- else {
- // �ڶ��ε������ɴ���
- m_isCreating = false;
- QPointF endPos = mapToScene(event->pos());
- scene()->removeItem(m_pTempLine);
- delete m_pTempLine;
- RulerLineItem* ruler = new RulerLineItem(QLineF(m_startPos, endPos));
- ruler->setRulerText(tr("test ruler"));
- ruler->setZValue(2);
- scene()->addItem(ruler);
- }
- }
- event->accept();
- }
- QGraphicsView::mousePressEvent(event);
- }
- void ImageView::mouseMoveEvent(QMouseEvent* event) {
- if (m_isCreating && m_pTempLine) {
- QPointF currentPos = mapToScene(event->pos());
- m_pTempLine->setLine(QLineF(m_startPos, currentPos));
- }
- if (m_bMouseTranslate) {
- // ������굱ǰλ�����ϴ�λ�õIJ�ֵ
- QPointF delta = event->pos() - m_lastMousePos;
- // ƽ����ͼ
- horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x());
- verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y());
- m_lastMousePos = event->pos(); // ��������
- }
- else if ((event->buttons() & Qt::RightButton) && m_isDrawing && m_rightButtonPressed) {
- if (!m_curDrawing && (event->pos() - m_rightClickPressPos).manhattanLength() > 5) {
- m_curDrawing = true;
- // ���ݳ�ʼλ�ÿ�ʼ����·��
- QPointF scenePos = mapToScene(m_rightClickPressPos);
- m_currentPath = QPainterPath(scenePos);
- m_currentPathItem = new QGraphicsPathItem();
- m_currentPathItem->setPen(QPen(Qt::red, 2));
- m_currentPathItem->setPath(m_currentPath);
- m_currentPathItem->setZValue(2);
- scene()->addItem(m_currentPathItem);
- m_drawnPaths.append(m_currentPathItem);
- }
- if (m_curDrawing && m_currentPathItem) {
- QPointF scenePos = mapToScene(event->pos());
- m_currentPath.lineTo(scenePos);
- m_currentPathItem->setPath(m_currentPath);
- }
- event->accept();
- return;
- }
- QGraphicsView::mouseMoveEvent(event);
- }
- void ImageView::mouseReleaseEvent(QMouseEvent* event) {
- if (event->button() == Qt::LeftButton) {
- setCursor(Qt::ArrowCursor);
- m_bMouseTranslate = false;
- }
- else if (event->button() == Qt::RightButton && m_rightButtonPressed) {
- if (!m_curDrawing) {
- if (!m_bRulerState) {
- QMenu menu(this);
- QAction* act1 = menu.addAction(tr("save picture"));
- QAction* act2 = menu.addAction(tr("clear"));
- connect(act1, &QAction::triggered, this, [this]() {
- saveImage();
- });
- connect(act2, &QAction::triggered, this, [this]() {
- clearDrawnLines();
- });
- menu.exec(event->globalPos());
- }
- }
- else {
- m_currentPathItem = nullptr;
- m_curDrawing = false;
- }
- m_rightButtonPressed = false;
- event->accept();
- return;
- }
- QGraphicsView::mouseReleaseEvent(event);
- }
- void ImageView::wheelEvent(QWheelEvent* event)
- {
- if (event->orientation() == Qt::Vertical) {
- event->ignore(); // ������ֱ�����¼��������ù�����������
- return;
- }
- event->accept();
- }
- void ImageView::resizeEvent(QResizeEvent* event)
- {
- QGraphicsView::resizeEvent(event);
- viewport()->update(); // ���ڴ�С�ı�ʱ�ػ�ʮ����
- }
- void ImageView::scrollContentsBy(int dx, int dy)
- {
- QGraphicsView::scrollContentsBy(dx, dy);
- viewport()->update(); // ����ʱ����ʮ����
- }
- void ImageView::drawCrosshair(QPainter& painter)
- {
- const QRect viewRect = viewport()->rect();
- int resolutionWidth = viewRect.width();
- int resolutionHeight = viewRect.height();
- painter.setPen(QPen(QColor(139, 105, 20, 255), 1));
- // ���ƴ�ֱ��
- painter.drawLine(resolutionWidth / 2, 0, resolutionWidth / 2, resolutionHeight);
- // ����ˮƽ��
- painter.drawLine(0, resolutionHeight / 2, resolutionWidth, resolutionHeight / 2);
- int centerX = resolutionWidth / 2;
- int centerY = resolutionHeight / 2;
- int rulerLength = viewRect.width(); // ���߳���
- int tickSpacing = 5; // �̶ȼ��
- // ����ˮƽ�������ϵ�����
- int rulerStartXHorizontal = centerX;
- int rulerStartYHorizontal = centerY;
- for (int i = 0; i <= rulerLength / 2; i += tickSpacing) {
- int tickHeight = 0;
- if (i % (tickSpacing * 10) == 0) { // ���̶�
- tickHeight = 15;
- }
- else if (i % (tickSpacing * 5) == 0) { // �еȿ̶�
- tickHeight = 10;
- }
- else { // �̶̿�
- tickHeight = 5;
- }
- painter.drawLine(rulerStartXHorizontal + i, rulerStartYHorizontal, rulerStartXHorizontal + i, rulerStartYHorizontal - tickHeight); // ���ƿ̶���
- painter.drawLine(rulerStartXHorizontal - i, rulerStartYHorizontal, rulerStartXHorizontal - i, rulerStartYHorizontal - tickHeight); // ���ƿ̶���
- }
- // ���ƴ�ֱ�������ϵ�����
- int rulerStartXVertical = centerX;
- int rulerStartYVertical = centerY;
- for (int i = 0; i <= rulerLength / 2; i += tickSpacing) {
- int tickWidth = 0;
- if (i % (tickSpacing * 10) == 0) { // ���̶�
- tickWidth = 15;
- }
- else if (i % (tickSpacing * 5) == 0) { // �еȿ̶�
- tickWidth = 10;
- }
- else { // �̶̿�
- tickWidth = 5;
- }
- painter.drawLine(rulerStartXVertical, rulerStartYVertical - i, rulerStartXVertical - tickWidth, rulerStartYVertical - i);
- painter.drawLine(rulerStartXVertical, rulerStartYVertical + i, rulerStartXVertical - tickWidth, rulerStartYVertical + i);
- }
- }
- void ImageView::saveImage()
- {
- // ʹ�õ�ǰʱ������Ĭ���ļ���
- QString defaultFileName = QDateTime::currentDateTime().toString("yyyy-MM-dd_HH-mm-ss") + ".png";
- QString fileName = QFileDialog::getSaveFileName(
- this,
- tr("����ͼƬ"),
- QDir::homePath() + "/" + defaultFileName, // Ĭ��·��Ϊ�û�Ŀ¼���ļ���Ϊ��ǰʱ��
- tr("PNG �ļ� (*.png);;JPEG �ļ� (*.jpg);;�����ļ� (*)")
- );
- if (!fileName.isEmpty()) {
- QImage image(viewport()->size(), QImage::Format_ARGB32);
- image.fill(Qt::white);
- QPainter painter(&image);
- this->render(&painter);
- if (!image.save(fileName)) {
- QMessageBox::warning(this, tr("����ʧ��"), tr("������ͼƬ��ָ��·����"));
- }
- else {
- QMessageBox::information(this, tr("����ɹ�"), tr("ͼƬ�ѳɹ����浽��") + fileName);
- }
- painter.end();
- }
- }
- void ImageView::clearDrawnLines()
- {
- qDeleteAll(m_drawnPaths);
- m_drawnPaths.clear();
- foreach(QGraphicsItem * item, scene()->selectedItems()) {
- if (nullptr == item)
- continue;
- scene()->removeItem(item);
- }
- }
|