#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QWheelEvent>
static const QRect selectRect
(-1,
-1,
3,
3);
{
public:
, grabItem(0)
{}
void drawForeground
(QPainter* painter,
const QRectF
& rect
) {
painter
->setRenderHint
(QPainter::Antialiasing,
false);
if(ellipse && ellipse->isSelected())
{
QPoint point1
= mapFromScene
(ellipse
->scenePos
()+ellipse
->rect
().
topLeft() );
QPoint point2
= mapFromScene
(ellipse
->scenePos
()+ellipse
->rect
().
bottomRight() );
painter->setMatrixEnabled(false);
painter->setBrush(Qt::black);
painter->drawRect(selectRect.translated(point1));
painter->drawRect(selectRect.translated(point2));
}
}
}
{
if(ellipse && ellipse->isSelected())
{
QPoint diff
= mapFromScene
(ellipse
->scenePos
()+ellipse
->rect
().
topLeft())-point;
if(selectRect.adjusted(-1,-1,1,1).contains(diff)){
topleft=true;
return ellipse;
}
diff = mapFromScene(ellipse->scenePos()+ellipse->rect().bottomRight())-point;
if(selectRect.adjusted(-1,-1,1,1).contains(diff)){
topleft=false;
return ellipse;
}
}
}
return 0;
}
{
mousePos = event->pos();
grabItem = hittest(mousePos, topleft);
if(grabItem==0)
}
{
if(grabItem){
QPointF diff
= mapToScene
(newPos
)-mapToScene
(mousePos
);
if(topleft)
grabItem->setRect(grabItem->rect().adjusted(diff.x(), diff.y(),0,0));
else
grabItem->setRect(grabItem->rect().adjusted(0,0,diff.x(), diff.y()));
mousePos=newPos;
}
else
}
{
if(grabItem)
grabItem=0;
else
}
{
if(event->delta()<0)
scale(0.8, 0.8);
else
scale(1.25, 1.25);
}
private:
bool topleft;
};
int main(int argc, char *argv[])
{
GraphicsView* view = new GraphicsView(&scene);
view
->setRenderHint
(QPainter::Antialiasing);
ellipse
->setFlags
(QGraphicsItem::ItemIsMovable|QGraphicsItem
::ItemIsSelectable);
ellipse
->setFlags
(QGraphicsItem::ItemIsMovable|QGraphicsItem
::ItemIsSelectable);
ellipse->setPos(100,50);
view->show();
return app.exec();
}
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QWheelEvent>
static const QRect selectRect(-1,-1,3,3);
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QGraphicsScene *scene, QWidget *parent = 0)
: QGraphicsView(scene, parent)
, grabItem(0)
{}
void drawForeground(QPainter* painter, const QRectF& rect)
{
painter->setRenderHint(QPainter::Antialiasing, false);
foreach(QGraphicsItem*item, scene()->items()){
QGraphicsEllipseItem* ellipse = qgraphicsitem_cast<QGraphicsEllipseItem*>(item);
if(ellipse && ellipse->isSelected())
{
QPoint point1 = mapFromScene(ellipse->scenePos()+ellipse->rect().topLeft() );
QPoint point2 = mapFromScene(ellipse->scenePos()+ellipse->rect().bottomRight() );
painter->setMatrixEnabled(false);
painter->setBrush(Qt::black);
painter->drawRect(selectRect.translated(point1));
painter->drawRect(selectRect.translated(point2));
}
}
}
QGraphicsEllipseItem* hittest(QPoint point, bool& topleft)
{
foreach(QGraphicsItem*item, scene()->items()){
QGraphicsEllipseItem* ellipse = qgraphicsitem_cast<QGraphicsEllipseItem*>(item);
if(ellipse && ellipse->isSelected())
{
QPoint diff = mapFromScene(ellipse->scenePos()+ellipse->rect().topLeft())-point;
if(selectRect.adjusted(-1,-1,1,1).contains(diff)){
topleft=true;
return ellipse;
}
diff = mapFromScene(ellipse->scenePos()+ellipse->rect().bottomRight())-point;
if(selectRect.adjusted(-1,-1,1,1).contains(diff)){
topleft=false;
return ellipse;
}
}
}
return 0;
}
void mousePressEvent(QMouseEvent*event)
{
mousePos = event->pos();
grabItem = hittest(mousePos, topleft);
if(grabItem==0)
QGraphicsView::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent*event)
{
if(grabItem){
QPoint newPos = event->pos();
QPointF diff = mapToScene(newPos)-mapToScene(mousePos);
if(topleft)
grabItem->setRect(grabItem->rect().adjusted(diff.x(), diff.y(),0,0));
else
grabItem->setRect(grabItem->rect().adjusted(0,0,diff.x(), diff.y()));
mousePos=newPos;
}
else
QGraphicsView::mouseMoveEvent(event);
}
void mouseReleaseEvent(QMouseEvent*event)
{
if(grabItem)
grabItem=0;
else
QGraphicsView::mouseReleaseEvent(event);
}
void wheelEvent(QWheelEvent* event)
{
if(event->delta()<0)
scale(0.8, 0.8);
else
scale(1.25, 1.25);
}
private:
QPoint mousePos;
QGraphicsEllipseItem* grabItem;
bool topleft;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene scene;
GraphicsView* view = new GraphicsView(&scene);
view->setRenderHint(QPainter::Antialiasing);
QGraphicsEllipseItem* ellipse;
ellipse = new QGraphicsEllipseItem(QRect(0,0,50,50),0, &scene);
ellipse->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
ellipse = new QGraphicsEllipseItem(QRect(0,0,50,50),0, &scene);
ellipse->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
ellipse->setPos(100,50);
view->show();
return app.exec();
}
To copy to clipboard, switch view to plain text mode
Bookmarks