|
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.imageitem.h
- #ifndef IMAGEITEM_H
- #define IMAGEITEM_H
- #include "imageitem_global.h"
- #include "QtGui/QGraphicsitem.h"
- #include "Qt/qpixmap.h"
- class IMAGEITEM_EXPORT ImageItem : public QGraphicsRectItem
- {
- public:
- ImageItem(QPixmap img,int inputwidth,int inputheight,bool fixedimage);
- int getbeginX();
- int getbeginY();
- int getrectX();
- int getrectY();
- float getscale();
- int getangle();
- ~ImageItem();
- void setbeginX(int bx);
- void setbeginY(int by);
- void setrectX(int rx);
- void setrectY(int ry);
- void setangle(int a);
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
- void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
- void setpaintRect(bool pr);
- //void ImageItem::dragEnterEvent(QGraphicsSceneMouseEvent *event);
- //void ImageItem::dragLeaveEvent(QGraphicsSceneMouseEvent *event);
- //void ImageItem::dragMoveEvent(QGraphicsSceneMouseEvent *event);
- protected :
- void paint( QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget );
- //void paintEvent(QPaintEvent *event);
- private:
- QImage image;
- QPixmap pixmap;
- int width;
- int height;
- int nowx;
- int nowy;
- int beginx;
- int beginy;
- int rectx;
- int recty;
- int angle;
- float scale;
- bool paintRect;
- bool showPoint;
- bool isfixed;
- bool positionchange;
- };
- #endif // IMAGEITEM_H
2.imageitem.cpp - #include "imageitem.h"
- #include "Qt/qpixmap.h"
- #include "QtGui/QPainter.h"
- #include "QtGui/QGraphicsitem.h"
- #include <QtGui/QGraphicsSceneMouseEvent>
- #include <QtGui/QStyleOptionGraphicsItem>
- ImageItem::ImageItem(QPixmap img,int inputwidth=400,int inputheight=300,bool fixedimage=0): pixmap(img)
- {
- angle=0;
- scale=1;
- paintRect=false;
- showPoint=false;
- positionchange=false;
- isfixed=fixedimage;
- beginx=0;
- beginy=0;
- rectx=0;
- recty=0;
- nowx=0;
- nowx=0;
- float widthscale=pixmap.width()/inputwidth;
- float heightscale=pixmap.height()/inputheight;
- scale=(widthscale>heightscale)?widthscale:heightscale;
- width=pixmap.width()/scale;
- height=pixmap.height()/scale;
- setRect(0, 0,width ,height );
- //setFlag(ItemIsMovable);
- //connect(this,SIGNAL(mouseReleaseEvent()),this,SLOT(paint());
- }
- void ImageItem::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- QPointF center(width/2,height/2);
- p->translate(center);
- p->rotate(angle);
- p->translate(-center);
- QPixmap fitpixmap=pixmap.scaled(width,height);
- p->drawPixmap( option->exposedRect, fitpixmap, option->exposedRect );
- p->translate(center);
- p->rotate(-angle);
- p->translate(-center);
- if(paintRect)
- {
- p->drawRect(beginx,beginy,rectx,recty);
-
- }
- if(showPoint)
- {
- p->drawText(nowx,nowy,QString("%1").arg(nowx*scale)+","+QString("%1").arg(nowy*scale));
- }
- //p->drawPixmap( option->exposedRect, pixmap, option->exposedRect );
- }
- void ImageItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
- {
- if(isfixed)
- {
- beginx=event->buttonDownPos(Qt::RightButton).x();
- beginy=event->buttonDownPos(Qt::RightButton).y();
- nowx=beginx;
- nowy=beginy;
- //QPainter painter(&pixmap);
- //painter.drawText(x,y,x+",111111111111111111"+y);
- showPoint=true;
- this->update();
- event->accept();
- }
- else
- {
- if(!beginx)
- event->accept();
- if(abs(beginx-event->buttonDownPos(Qt::RightButton).x())<20 ||abs(beginy-event->buttonDownPos(Qt::RightButton).y())<20)
- {
- showPoint=true;
- positionchange=true;
- }
- }
- }
- void ImageItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
- {
- if(isfixed)
- {
- rectx=event->buttonDownPos(Qt::RightButton).x()-beginx;
- recty=event->buttonDownPos(Qt::RightButton).y()-beginy;
- paintRect=true;
- showPoint=false;
- this->update();
- event->accept();
- }
- else
- {
- beginx=event->buttonDownPos(Qt::RightButton).x();
- beginy=event->buttonDownPos(Qt::RightButton).y();
- showPoint=false;
- this->update();
- }
- }
- void ImageItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
- {
- if(isfixed)
- {
- nowx=event->buttonDownPos(Qt::RightButton).x();
- nowy=event->buttonDownPos(Qt::RightButton).y();
- //QPainter painter(&pixmap);
- //painter.drawText(x,y,x+",111111111111111111"+y);
- showPoint=true;
- this->update();
- }
- else
- {
- beginx=event->buttonDownPos(Qt::RightButton).x();
- beginy=event->buttonDownPos(Qt::RightButton).y();
- showPoint=true;
- this->update();
-
-
- }
- //event->ignore();
- //event->accept();
- }
- int ImageItem::getbeginX()
- {
- return beginx;
- }
- int ImageItem::getbeginY()
- {
- return beginy;
- }
- int ImageItem::getrectX()
- {
- return rectx;
- }
- int ImageItem::getrectY()
- {
- return recty;
- }
- void ImageItem::setbeginX(int bx)
- {
- beginx=bx;
- }
- void ImageItem::setbeginY(int by)
- {
- beginy=by;
- }
- void ImageItem::setrectX(int rx)
- {
- rectx=rx;
- }
- void ImageItem::setrectY(int ry)
- {
- recty=ry;
- }
- void ImageItem::setpaintRect(bool pr)
- {
- paintRect=pr;
- }
- void ImageItem::setangle(int a)
- {
- angle=a;
- }
- ImageItem::~ImageItem()
- {
- }
3.调用 graphvbiew .h - #ifndef GRAPHVBIEW_H
- #define GRAPHVBIEW_H
- #include <QtGui/QMainWindow>
- #include "ui_graphvbiew.h"
- #include "imageitem.h"
- class graphvbiew : public QMainWindow
- {
- Q_OBJECT
- public:
- graphvbiew(QWidget *parent = 0, Qt::WFlags flags = 0);
- void paintEvent(QPaintEvent *event);
- ~graphvbiew();
- void graphvbiew::mouseReleaseEvent(QMouseEvent *event);
- private:
- Ui::graphvbiewClass ui;
- int x,y;
- QPixmap pixmap;
- ImageItem* fixeditem;
- ImageItem* movingitem;
- ImageItem* resultitem;
- private slots:
- void on_dockWidget_topLevelChanged(bool);
- void on_pushButton_clicked();
- };
- #endif // GRAPHVBIEW_H
graphvbiew.cpp - #include "graphvbiew.h"
- #include "test.h"
- #include <QtGui/QGraphicsView>
- #include <QtGui/QGraphicsRectItem>
- #include <QtGui/QGraphicsScene>
- #include <QtGui/QPixmap>
- #include "QtGui/QGraphicsitem.h"
- #include <QtGui/QGraphicsSceneMouseEvent>
- #include <QtGui/QStyleOptionGraphicsItem>
- #include "imageitem.h"
- //static QPixmap *pixmap;
- graphvbiew::graphvbiew(QWidget *parent, Qt::WFlags flags)
- : QMainWindow(parent, flags)
- {
- ui.setupUi(this);
- resize(800,600);
- QPixmap pixmap1("D:\\bmp\\3.bmp");
- QPixmap pixmap("D:\\bmp\\1.bmp");
- QGraphicsScene* scene=new QGraphicsScene;
- QGraphicsRectItem *rect=new QGraphicsRectItem;
- QWidget *test=this->centralWidget();
- QGraphicsView *view=test->findChild<QGraphicsView *>("graphicsView");
- view->setGeometry(QRect(0, 0, 800, 600));
- view->resize(800,600);
- view->setScene(scene);
- fixeditem = new ImageItem(pixmap,300,600,1);
- movingitem = new ImageItem(pixmap1,300,600,0);
- fixeditem->setPos(50,0);
- movingitem->setPos(400,0);
- scene->addItem(fixeditem);
- scene->addItem(movingitem);
- ui.graphicsView->repaint();
- //test::show();
- //ui.centralWidget
- //pixmap=QPixmap(100,50);
- // background=QPixmap("D:\\bmp\\1.bmp");
- // x=-1;
- // y=-1;
- //scene->setSceneRect(0,0);
- //view->centerOn(400,300);
- //pixmap=new QPixmap[2];
- //pixmap.load("D:\\bmp\\1.bmp");
- //QGraphicsRectItem test1=new QGraphicsRectItem;
- //this->get
- //->setScene(scene);
- //QPainter painter;
- //ui.graphicsView->setBackgroundBrush(pixmap);
- //painter.begin(&pixmap);
- //painter.drawPixmap(0,0, pixmap);
- //painter.end();
- //ui.graphicsView->show();
- }
- graphvbiew::~graphvbiew()
- {
- }
- void graphvbiew::mouseReleaseEvent(QMouseEvent *event)
- {
- int k=fixeditem->getbeginX();
- //QWidget *test=this->centralWidget();
- //QGraphicsView *view=test->findChild<QGraphicsView *>("graphicsView");
- //QGraphicsScene* scene=view->scene();
- //ImageItem* some=scene->findChild<ImageItem *>("imageitem1");
- //int k=some->getbeginX();
- //this->setCentralWidget()
- // test *tempwidget=new test();
- ////x=event->x();
- ////y=event->y();
- ////ui.centralWidget->mouseMoveEvent();
- ////event->getX();
- ////pixmap.fill(QColor(255,255,255,127));
- ////x=*event->x();
- // ui.centralWidget->grabMouse();
- //x=ui.centralWidget->x();
- ////ui.centralWidget->
- //QPainter painter(&pixmap);
- //painter.drawImage(
- //painter.setPen(QColor(255,0,0));
- ////painter.drawText(20,40,QString("%1").arg(x)+","+QString("%1").arg(y));
- //painter.drawText(20,40,"a");
- //update();
- }
- void graphvbiew::paintEvent(QPaintEvent *event)
- {
- //QPainter painter(this);
- //painter.drawPixmap(0,0,background);
- //painter.drawPixmap(x,y,pixmap);
- }
- void graphvbiew::on_pushButton_clicked()
- {
- movingitem->setbeginX(fixeditem->getbeginX());
- movingitem->setbeginY(fixeditem->getbeginY());
- movingitem->setrectX(fixeditem->getrectX());
- movingitem->setrectY(fixeditem->getrectY());
- //movingitem->setangle(30);
- movingitem->setpaintRect(true);
- movingitem->update();
- }
- void graphvbiew::on_dockWidget_topLevelChanged(bool)
- {
- }
|