- //EPmapImage.h
#ifndef EPMAPIMAGE_H #define EPMAPIMAGE_H #include <QObject> #include <QRect> #include <QImage> class EPmapImage : public QObject { Q_OBJECT public: explicit EPmapImage(QObject *parent = 0); void setRect(const QRect rect); void setImage(QImage image); void setImageSize(); void setImageAlpha(); const QRect &getRect(); QImage& getImage(); int getHandleCount(); //获得图片的控制点,总共8个 QCursor getHandleCursor(int nHandle); //根据不同的控制点设置鼠标的形状 QPoint getHandle(int nHandle); //获得每个控制点的坐标 void moveHandleTo(QPoint &newPos, int index); //把图片的控制点移动这个newPos位置 virtual void paint(QPainter &painter,QWidget *view = 0); //根据rect,image绘制图形。
private: QImage image; QRect rect; }; #endif // EPMAPIMAGE_H
- //EPmapImage.cpp
#include "EPmapImage.h" #include <QPainter> #include <QCursor> #include <QDebug> EPmapImage::EPmapImage(QObject *parent) : QObject(parent) { } void EPmapImage::setRect(const QRect rect) { this->rect = rect; } const QRect& EPmapImage::getRect() { return rect; } void EPmapImage::setImage(QImage image) { this->image = image; } void EPmapImage::setImageSize() { image = image.scaled(rect.width(),rect.height()); setImageAlpha(); } void EPmapImage::setImageAlpha() { QRgb rgb; for(int i = 0;i<rect.width();i++) for(int j = 0; j<rect.height(); j++) { QRgb rgb1 = image.pixel(i,j); rgb = qRgba(qRed(rgb1),qGreen(rgb1),qBlue(rgb1),200); image.setPixel(i,j,rgb); } } QImage& EPmapImage::getImage() { return image; } int EPmapImage::getHandleCount() { return 8; } QCursor EPmapImage::getHandleCursor(int nHandle) { Qt::CursorShape id = Qt::ArrowCursor; switch (nHandle) { case 0: id = Qt::SizeAllCursor; break; case 1: case 5: id = Qt::SizeBDiagCursor; break; case 2: case 6: id = Qt::SizeVerCursor; break; case 3: case 7: id = Qt::SizeFDiagCursor; break; case 4: case 8: id = Qt::SizeHorCursor; break; } return QCursor(id); } QPoint EPmapImage::getHandle(int nHandle) { int x = 0, y = 0, xCenter,yCenter; xCenter = rect.center().x(); yCenter = rect.center().y(); switch (nHandle) { case 0: x = xCenter; y = yCenter; break; case 1: x = rect.right(); y = rect.top(); break; case 2: x = xCenter; y = rect.top(); break; case 3: x = rect.left(); y = rect.top(); break; case 4: x = rect.left(); y = yCenter; break; case 5: x = rect.left(); y = rect.bottom(); break; case 6: x = xCenter; y = rect.bottom(); break; case 7: x = rect.right(); y = rect.bottom(); break; case 8: x = rect.right(); y = yCenter; break; } return QPoint(x,y); } void EPmapImage::moveHandleTo(QPoint &newPos, int index) { switch (index) { case 0: rect.moveCenter(newPos); break; case 1: rect.setTopRight(newPos); break; case 2: rect.setTop(newPos.y()); break; case 3: rect.setTopLeft(newPos); break; case 4: rect.setLeft(newPos.x()); break; case 5: rect.setBottomLeft(newPos); break; case 6: rect.setBottom(newPos.y()); break; case 7: rect.setBottomRight(newPos); break; case 8: rect.setRight(newPos.x()); break; default: break; } rect = rect.normalized(); } void EPmapImage::paint(QPainter &painter, QWidget *view) { setImageSize(); painter.drawLine(rect.topLeft() + QPoint(-20,-20),rect.bottomRight() + QPoint(20,20)); painter.drawPixmap(rect.topLeft(),QPixmap::fromImage(image)); //painter.drawRect(rect); }
- //EPmapView
#ifndef EPMAPVIEW_H #define EPMAPVIEW_H #include <QWidget> #include <EPmapImage.h> class EPmapView : public QWidget { Q_OBJECT public: explicit EPmapView(QWidget *parent = 0); void setDrawImage(); //设置EPmapImage void paintRect(QPainter &painter,const QRect &rect); //绘制控制点的,8个小正方形。 protected: void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); //实现移动图片的位置,修改图片的大小的功能。 // void mouseReleaseEvent(QMouseEvent *); void mouseDoubleClickEvent(QMouseEvent *); //退出编辑图片 private: bool m_isSelectedRect; int m_cursorState; EPmapImage *m_cImage; }; #endif // EPMAPVIEW_H
- //EPmapView.cpp
#include "EPmapView.h" #include <QPainter> #include <QMouseEvent> #include <QDebug> EPmapView::EPmapView(QWidget *parent) : QWidget(parent) { setDrawImage(); resize(400,400); QImage& mage = m_cImage->getImage(); QPainter painter(&mage); painter.initFrom(this); painter.drawLine(200,100,100,200); } void EPmapView::paintEvent(QPaintEvent *) { QPainter painter(this); m_cImage->paint(painter,this); if(m_isSelectedRect) { QRect rect = m_cImage->getRect(); paintRect(painter,rect); } } void EPmapView::mousePressEvent(QMouseEvent *e) { if (m_cImage->getRect().contains(e->pos())) m_isSelectedRect = true; repaint(); } void EPmapView::mouseMoveEvent(QMouseEvent *e) { if(e->buttons() & Qt::LeftButton ) { QPoint pos = e->pos(); m_cImage->moveHandleTo(pos,m_cursorState); repaint(); } else for(int i = 0;i<=m_cImage->getHandleCount();i++) { QRect rect(m_cImage->getHandle(i)- QPoint(3,3),m_cImage->getHandle(i) + QPoint(3,3)); if(i == 0){ if(m_cImage->getRect().contains(e->pos()) && m_isSelectedRect){ setCursor(m_cImage->getHandleCursor(i)); m_cursorState = i; } else setCursor(QCursor(Qt::ArrowCursor)); } else { if(rect.contains(e->pos()) && m_isSelectedRect){ setCursor(m_cImage->getHandleCursor(i)); m_cursorState = i; } } } } void EPmapView::mouseDoubleClickEvent(QMouseEvent *) { m_isSelectedRect = false; m_cursorState = 100; repaint(); } void EPmapView::setDrawImage() { setMouseTracking(true); m_cursorState = 100; QRegion region; setMask(region); m_cImage = new EPmapImage; QImage image(QSize(100,100),QImage::Format_ARGB32_Premultiplied); QString str = ":/back.png"; image.load(str); qDebug()<<image.format(); m_cImage->setImage(image.convertToFormat(QImage::Format_ARGB32_Premultiplied)); QRect rect(100,100,200,200); m_cImage->setRect(rect); m_cImage->setImageSize(); m_isSelectedRect = false; } void EPmapView::paintRect(QPainter &painter, const QRect &rect) { QPen pen; pen.setColor(Qt::red); pen.setWidth(2); painter.setPen(pen); painter.setRenderHints(QPainter::Antialiasing); for(int i = 1;i<=m_cImage->getHandleCount();i++) { painter.drawRect(QRect(m_cImage->getHandle(i)-QPoint(3,3),m_cImage->getHandle(i)+QPoint(3,3))); } }
主要实现功能: 移动QImage,设置QImage透明现实,修改QImage的大小。 运行结果: 选中QImage 移动QImage
|