chen12nan的个人主页

学习Qt的感想

http://www.qtcn.org/bbs/u/133503  [收藏] [复制]

chen12nan

  • 11

    关注

  • 11

    粉丝

  • 19

    访客

  • 等级:新手上路
  • 总积分:12
  • 男,1988-07-20

最后登录:2016-11-04

更多资料

日志

实现QImage在窗口中通过鼠标来移动

2013-01-04 22:32
  1. //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
  1. //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);
    }
  1. //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
  1. //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


分类:Qt笔记|回复:1|浏览:2600|全站可见|转载
 
 
删除

xzoscar  

2013-01-05 15:00 -

Powered by phpwind v8.7 Certificate Copyright Time now is:04-25 12:21
©2005-2016 QTCN开发网 版权所有 Gzip disabled