• 14274阅读
  • 1回复

QT上graphicsview上加载图片以及对图片框选 [复制链接]

上一主题 下一主题
离线sonyyt
 

只看楼主 倒序阅读 楼主  发表于: 2008-05-15
QT上graphicsview上加载图片以及对图片框选
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
仔细查了下论文,没有相关资料.QT EXAMPLE里有一个加载蝴蝶的程序.精通QT4编程里也有些相关程序.但是目前没看到有对图片框选的代码.
我的课题是配准,后台用ITK包处理,需要前台框选得到原始图像和待配准图像的大概区域.具体要求是图像1中进行框选,图像2生成框并可以拖动框.前台是缩放后的图像,得到图像区域的真实坐标.
实现思路是通过自定义imageitem类public QGraphicsRectItem,成员缩放系数,旋转角度,鼠标点击坐标,鼠标释放坐标,等一些参数,重载paint,mousepressevent,mousemoveevent,mouseReleaseEvent事件.
接触QT只有俩礼拜..所以程序做的挺糙的,希望能为以后的新人节省些时间.另外请高手指点一下图片2旋转的时候如何取得真实坐标.

代码:
  1. 1.imageitem.h
  2. #ifndef IMAGEITEM_H
  3. #define IMAGEITEM_H
  4. #include "imageitem_global.h"
  5. #include "QtGui/QGraphicsitem.h"
  6. #include "Qt/qpixmap.h"
  7. class IMAGEITEM_EXPORT ImageItem : public QGraphicsRectItem
  8. {
  9. public:
  10.     ImageItem(QPixmap img,int inputwidth,int inputheight,bool fixedimage);
  11.     int getbeginX();
  12.     int getbeginY();
  13.     int getrectX();
  14.     int getrectY();
  15.     float getscale();
  16.     int getangle();
  17.     ~ImageItem();
  18.     void setbeginX(int bx);
  19.     void setbeginY(int by);
  20.     void setrectX(int rx);
  21.     void setrectY(int ry);
  22.     void setangle(int a);
  23.     void mousePressEvent(QGraphicsSceneMouseEvent *event);
  24.     void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
  25.     void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
  26.     void setpaintRect(bool pr);
  27.     //void ImageItem::dragEnterEvent(QGraphicsSceneMouseEvent *event);
  28.     //void ImageItem::dragLeaveEvent(QGraphicsSceneMouseEvent *event);
  29.     //void ImageItem::dragMoveEvent(QGraphicsSceneMouseEvent *event);
  30. protected :
  31.     void paint( QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget );
  32.     //void paintEvent(QPaintEvent *event);
  33. private:
  34.      QImage image;
  35.     QPixmap pixmap;
  36.      int width;
  37.      int height;
  38.      int nowx;
  39.      int nowy;
  40.      int beginx;
  41.      int beginy;
  42.      int rectx;
  43.      int recty;
  44.      int angle;
  45.      float scale;
  46.      bool paintRect;
  47.      bool showPoint;
  48.      bool isfixed;
  49.      bool positionchange;
  50. };
  51. #endif // IMAGEITEM_H

2.imageitem.cpp
  1. #include "imageitem.h"
  2. #include "Qt/qpixmap.h"
  3. #include "QtGui/QPainter.h"
  4. #include "QtGui/QGraphicsitem.h"
  5. #include <QtGui/QGraphicsSceneMouseEvent>
  6. #include <QtGui/QStyleOptionGraphicsItem>
  7. ImageItem::ImageItem(QPixmap img,int inputwidth=400,int inputheight=300,bool fixedimage=0): pixmap(img)
  8. {
  9.     angle=0;
  10.     scale=1;
  11.     paintRect=false;
  12.     showPoint=false;
  13.     positionchange=false;
  14.     isfixed=fixedimage;
  15.     beginx=0;
  16.     beginy=0;
  17.     rectx=0;
  18.     recty=0;
  19.     nowx=0;
  20.     nowx=0;
  21.      float widthscale=pixmap.width()/inputwidth;
  22.      float heightscale=pixmap.height()/inputheight;
  23.      scale=(widthscale>heightscale)?widthscale:heightscale;
  24.      width=pixmap.width()/scale;
  25.      height=pixmap.height()/scale;
  26.      setRect(0, 0,width ,height );
  27.     //setFlag(ItemIsMovable);
  28.     //connect(this,SIGNAL(mouseReleaseEvent()),this,SLOT(paint());
  29. }
  30. void ImageItem::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget)
  31. {
  32.      QPointF center(width/2,height/2);
  33.      p->translate(center);
  34.      p->rotate(angle);
  35.      p->translate(-center);
  36.      QPixmap fitpixmap=pixmap.scaled(width,height);
  37.      p->drawPixmap( option->exposedRect, fitpixmap, option->exposedRect );
  38.      p->translate(center);
  39.      p->rotate(-angle);
  40.      p->translate(-center);
  41.      if(paintRect)
  42.      {
  43.          p->drawRect(beginx,beginy,rectx,recty);
  44.     
  45.      }
  46.      if(showPoint)
  47.      {
  48.          p->drawText(nowx,nowy,QString("%1").arg(nowx*scale)+","+QString("%1").arg(nowy*scale));
  49.      }
  50.     //p->drawPixmap( option->exposedRect, pixmap, option->exposedRect );
  51. }
  52. void ImageItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
  53. {
  54.     if(isfixed)
  55.     {   
  56.         beginx=event->buttonDownPos(Qt::RightButton).x();
  57.         beginy=event->buttonDownPos(Qt::RightButton).y();
  58.         nowx=beginx;
  59.         nowy=beginy;
  60.         //QPainter painter(&pixmap);
  61.         //painter.drawText(x,y,x+",111111111111111111"+y);
  62.         showPoint=true;
  63.         this->update();
  64.         event->accept();
  65.     }
  66.     else
  67.     {
  68.         if(!beginx)
  69.             event->accept();
  70.         if(abs(beginx-event->buttonDownPos(Qt::RightButton).x())<20 ||abs(beginy-event->buttonDownPos(Qt::RightButton).y())<20)
  71.         {
  72.             showPoint=true;
  73.             positionchange=true;
  74.         }
  75.     }
  76. }
  77. void ImageItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
  78. {
  79.     if(isfixed)
  80.     {   
  81.         rectx=event->buttonDownPos(Qt::RightButton).x()-beginx;
  82.         recty=event->buttonDownPos(Qt::RightButton).y()-beginy;
  83.         paintRect=true;
  84.         showPoint=false;
  85.         this->update();
  86.         event->accept();
  87.     }
  88.     else
  89.     {
  90.         beginx=event->buttonDownPos(Qt::RightButton).x();
  91.         beginy=event->buttonDownPos(Qt::RightButton).y();
  92.         showPoint=false;
  93.         this->update();
  94.     }
  95. }
  96. void ImageItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  97. {
  98.     if(isfixed)
  99.     {   
  100.     nowx=event->buttonDownPos(Qt::RightButton).x();
  101.     nowy=event->buttonDownPos(Qt::RightButton).y();
  102.     //QPainter painter(&pixmap);
  103.     //painter.drawText(x,y,x+",111111111111111111"+y);
  104.     showPoint=true;
  105.     this->update();
  106.     }
  107.     else
  108.     {
  109.         beginx=event->buttonDownPos(Qt::RightButton).x();
  110.         beginy=event->buttonDownPos(Qt::RightButton).y();
  111.         showPoint=true;
  112.         this->update();
  113.    
  114.    
  115.     }
  116.     //event->ignore();
  117.     //event->accept();
  118. }
  119. int ImageItem::getbeginX()
  120. {   
  121.     return beginx;
  122. }
  123. int ImageItem::getbeginY()
  124. {
  125.     return beginy;
  126. }
  127. int ImageItem::getrectX()
  128. {
  129.     return rectx;
  130. }
  131. int ImageItem::getrectY()
  132. {
  133.     return recty;
  134. }
  135. void ImageItem::setbeginX(int bx)
  136. {
  137.     beginx=bx;
  138. }
  139. void ImageItem::setbeginY(int by)
  140. {
  141.     beginy=by;
  142. }
  143. void ImageItem::setrectX(int rx)
  144. {
  145.     rectx=rx;
  146. }
  147. void ImageItem::setrectY(int ry)
  148. {
  149.     recty=ry;
  150. }
  151. void ImageItem::setpaintRect(bool pr)
  152. {
  153.     paintRect=pr;
  154. }
  155. void ImageItem::setangle(int a)
  156. {
  157.     angle=a;
  158. }
  159. ImageItem::~ImageItem()
  160. {
  161. }

3.调用

graphvbiew .h
  1. #ifndef GRAPHVBIEW_H
  2. #define GRAPHVBIEW_H
  3. #include <QtGui/QMainWindow>
  4. #include "ui_graphvbiew.h"
  5. #include "imageitem.h"
  6. class graphvbiew : public QMainWindow
  7. {
  8.     Q_OBJECT
  9. public:
  10.     graphvbiew(QWidget *parent = 0, Qt::WFlags flags = 0);
  11.     void paintEvent(QPaintEvent *event);
  12.     ~graphvbiew();
  13.     void graphvbiew::mouseReleaseEvent(QMouseEvent *event);
  14. private:
  15.     Ui::graphvbiewClass ui;
  16.     int x,y;
  17.     QPixmap pixmap;
  18.     ImageItem* fixeditem;
  19.     ImageItem* movingitem;
  20.     ImageItem* resultitem;
  21. private slots:
  22.     void on_dockWidget_topLevelChanged(bool);
  23.     void on_pushButton_clicked();
  24. };
  25. #endif // GRAPHVBIEW_H

graphvbiew.cpp
  1. #include "graphvbiew.h"
  2. #include "test.h"
  3. #include <QtGui/QGraphicsView>
  4. #include <QtGui/QGraphicsRectItem>
  5. #include <QtGui/QGraphicsScene>
  6. #include <QtGui/QPixmap>
  7. #include "QtGui/QGraphicsitem.h"
  8. #include <QtGui/QGraphicsSceneMouseEvent>
  9. #include <QtGui/QStyleOptionGraphicsItem>
  10. #include "imageitem.h"
  11. //static QPixmap *pixmap;
  12. graphvbiew::graphvbiew(QWidget *parent, Qt::WFlags flags)
  13.     : QMainWindow(parent, flags)
  14. {
  15.     ui.setupUi(this);
  16.     resize(800,600);
  17.     QPixmap pixmap1("D:\\bmp\\3.bmp");
  18.     QPixmap pixmap("D:\\bmp\\1.bmp");
  19.     QGraphicsScene* scene=new QGraphicsScene;
  20.     QGraphicsRectItem *rect=new QGraphicsRectItem;
  21.     QWidget *test=this->centralWidget();
  22.     QGraphicsView *view=test->findChild<QGraphicsView *>("graphicsView");
  23.     view->setGeometry(QRect(0, 0, 800, 600));
  24.     view->resize(800,600);
  25.     view->setScene(scene);
  26.     fixeditem = new ImageItem(pixmap,300,600,1);
  27.     movingitem = new ImageItem(pixmap1,300,600,0);
  28.     fixeditem->setPos(50,0);
  29.     movingitem->setPos(400,0);
  30.     scene->addItem(fixeditem);
  31.     scene->addItem(movingitem);
  32.     ui.graphicsView->repaint();
  33.     //test::show();
  34.     //ui.centralWidget
  35.     //pixmap=QPixmap(100,50);
  36.     //    background=QPixmap("D:\\bmp\\1.bmp");
  37.     //    x=-1;
  38.     //    y=-1;
  39.     //scene->setSceneRect(0,0);
  40.     //view->centerOn(400,300);
  41.     //pixmap=new QPixmap[2];
  42.     //pixmap.load("D:\\bmp\\1.bmp");
  43.     //QGraphicsRectItem test1=new QGraphicsRectItem;
  44.     //this->get
  45.     //->setScene(scene);
  46.     //QPainter painter;
  47.     //ui.graphicsView->setBackgroundBrush(pixmap);
  48.     //painter.begin(&pixmap);
  49.     //painter.drawPixmap(0,0, pixmap);
  50.     //painter.end();
  51.     //ui.graphicsView->show();
  52. }
  53. graphvbiew::~graphvbiew()
  54. {
  55. }
  56. void graphvbiew::mouseReleaseEvent(QMouseEvent *event)
  57. {
  58.     int k=fixeditem->getbeginX();
  59.     //QWidget *test=this->centralWidget();
  60.     //QGraphicsView *view=test->findChild<QGraphicsView *>("graphicsView");
  61.     //QGraphicsScene* scene=view->scene();
  62.     //ImageItem* some=scene->findChild<ImageItem *>("imageitem1");
  63.     //int k=some->getbeginX();
  64.     //this->setCentralWidget()
  65.     //    test *tempwidget=new test();
  66.     ////x=event->x();
  67.     ////y=event->y();
  68.     ////ui.centralWidget->mouseMoveEvent();
  69.     ////event->getX();
  70.     ////pixmap.fill(QColor(255,255,255,127));
  71.     ////x=*event->x();
  72.     // ui.centralWidget->grabMouse();
  73.     //x=ui.centralWidget->x();
  74.     ////ui.centralWidget->
  75.     //QPainter painter(&pixmap);
  76.     //painter.drawImage(
  77.     //painter.setPen(QColor(255,0,0));
  78.     ////painter.drawText(20,40,QString("%1").arg(x)+","+QString("%1").arg(y));
  79.     //painter.drawText(20,40,"a");
  80.     //update();
  81. }
  82. void graphvbiew::paintEvent(QPaintEvent *event)
  83. {
  84.     //QPainter painter(this);
  85.     //painter.drawPixmap(0,0,background);
  86.     //painter.drawPixmap(x,y,pixmap);
  87. }
  88. void graphvbiew::on_pushButton_clicked()
  89. {
  90.     movingitem->setbeginX(fixeditem->getbeginX());
  91.     movingitem->setbeginY(fixeditem->getbeginY());
  92.     movingitem->setrectX(fixeditem->getrectX());
  93.     movingitem->setrectY(fixeditem->getrectY());
  94.     //movingitem->setangle(30);
  95.     movingitem->setpaintRect(true);
  96.     movingitem->update();
  97. }
  98. void graphvbiew::on_dockWidget_topLevelChanged(bool)
  99. {
  100. }
离线qihangjia
只看该作者 1楼 发表于: 2008-06-25
广告歌
快速回复
限100 字节
 
上一个 下一个