#include "drawtool.h"
#include "drawobj.h"
#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QtMath>
#define PI 3.14
QList<DrawTool*> DrawTool::c_tools;
QPointF DrawTool::c_down;
QPointF DrawTool::c_last;
quint32 DrawTool::c_nDownFlags;
DrawShape DrawTool::c_drawShape = selection;
static SelectTool selectTool;
static RectTool lineTool(line);
static RectTool rectTool(rectangle);
static RectTool roundRectTool(roundrect);
static RectTool ellipseTool(ellipse);
static RotationTool rotationTool;
enum SelectMode
{
none,
netSelect,
move,
size,
rotate
};
SelectMode selectMode = none;
SizeHandleRect::Direction nDragHandle = SizeHandleRect::None;
static void setCursor(QGraphicsScene * scene , const QCursor & cursor )
{
QList<QGraphicsView*> views = scene->views();
if ( views.count() > 0 ){
QGraphicsView * view = views.first();
view->setCursor(cursor);
}
}
DrawTool::DrawTool(DrawShape shape)
{
m_drawShape = shape ;
c_tools.push_back(this);
}
void DrawTool::mousePressEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
c_down = event->scenePos();
c_last = event->scenePos();
}
void DrawTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
c_last = event->scenePos();
}
void DrawTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
if (event->scenePos() == c_down)
c_drawShape = selection;
setCursor(scene,Qt::ArrowCursor);
}
DrawTool *DrawTool::findTool(DrawShape drawShape)
{
QList<DrawTool*>::const_iterator iter = c_tools.constBegin();
for ( ; iter != c_tools.constEnd() ; ++iter ){
if ((*iter)->m_drawShape == drawShape )
return (*iter);
}
return 0;
}
SelectTool::SelectTool()
:DrawTool(selection)
{
m_lastSize.setHeight(0);
m_lastSize.setWidth(0);
dashRect = 0;
dashLine = 0;
m_hoverSizer = false;
}
void SelectTool::mousePressEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
DrawTool::mousePressEvent(event,scene);
if (!m_hoverSizer)
scene->mouseEvent(event);
selectMode = none;
QList<QGraphicsItem *> items = scene->selectedItems();
GraphicsItem *item = 0;
if ( items.count() == 1 )
item = qgraphicsitem_cast<GraphicsItem*>(items.first());
if ( item != 0 ){
nDragHandle = item->hitTest(event->scenePos());
if ( nDragHandle !=SizeHandleRect::None)
selectMode = size;
else
selectMode = move;
m_lastSize = item->boundingRect().size();
}
if( selectMode == none ){
selectMode = netSelect;
QList<QGraphicsView*> views = scene->views();
if ( views.count() > 0 ){
QGraphicsView * view = views.first();
view->setDragMode(QGraphicsView::RubberBandDrag);
}
}
if ( selectMode == move && items.count() == 1 ){
if (dashRect ){
scene->removeItem(dashRect);
delete dashRect;
dashRect = 0;
}
if (dashLine ) {
scene->removeItem(dashLine);
delete dashLine;
dashLine = 0;
}
dashRect = new QGraphicsPathItem(item->shape());
dashRect->setPen(Qt::DashLine);
dashRect->setPos(item->pos());
dashRect->setTransformOriginPoint(item->transformOriginPoint());
dashRect->setTransform(item->transform());
dashRect->setRotation(item->rotation());
scene->addItem(dashRect);
dashLine = new QGraphicsLineItem();
dashLine->setPos(item->pos());
dashLine->setPen(Qt::DashLine);
scene->addItem(dashLine);
}
qDebug() << " selectTool press:" <<event->scenePos() << " mode :" << selectMode << " items :" << items.count();
}
void SelectTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
DrawTool::mouseMoveEvent(event,scene);
bool isGroup = false;
QList<QGraphicsItem *> items = scene->selectedItems();
GraphicsItem * item = 0;
if ( items.count() == 1 ){
item = qgraphicsitem_cast<GraphicsItem*>(items.first());
if ( item != 0 ){
if ( nDragHandle != SizeHandleRect::None && selectMode == size ){
QSizeF delta(c_last.x() - c_down.x() , c_last.y() - c_down.y());
item->resizeTo(nDragHandle,c_last);
}
else if(nDragHandle == SizeHandleRect::None && selectMode == selection ){
SizeHandleRect::Direction handle = item->hitTest(event->scenePos());
if ( handle != SizeHandleRect::None){
setCursor(scene,item->getCursor(handle));
m_hoverSizer = true;
}else{
setCursor(scene,Qt::ArrowCursor);
m_hoverSizer = false;
}
}
}
QGraphicsItemGroup *item1 = qgraphicsitem_cast<QGraphicsItemGroup*>(items.first());
if ( item1 != NULL ){
isGroup = true;
}
}
if ( selectMode == move ){
if ( dashRect ){
dashRect->setPos(c_last);
dashLine->setLine(QLineF(dashLine->mapFromItem(item,item->boundingRect().center()),
dashLine->mapFromScene(c_last)));
scene->update();
}
}
if ( (selectMode != size && items.count() > 1) || isGroup )
{
scene->mouseEvent(event);
}
}
void SelectTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
DrawTool::mouseReleaseEvent(event,scene);
QList<QGraphicsItem *> items = scene->selectedItems();
if ( items.count() == 1 ){
GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
if ( item != 0 && selectMode == move && c_last != c_down ){
item->setPos(c_last);
}
}
if (selectMode == netSelect ){
QList<QGraphicsView*> views = scene->views();
if ( views.count() > 0 ){
QGraphicsView * view = views.first();
view->setDragMode(QGraphicsView::NoDrag);
}
}
if (dashRect ){
scene->removeItem(dashRect);
delete dashRect;
dashRect = 0;
scene->removeItem(dashLine);
delete dashLine;
dashLine = 0;
}
selectMode = none;
nDragHandle = SizeHandleRect::None;
m_hoverSizer = false;
scene->mouseEvent(event);
qDebug() << " selectTool release:" <<event->scenePos() << "mode :" << selectMode;
}
RotationTool::RotationTool()
:DrawTool(rotation)
{
lastAngle == 0;
dashRect = 0;
}
void RotationTool::mousePressEvent(QGraphicsSceneMouseEvent *event, DrawScene *scene)
{
DrawTool::mousePressEvent(event,scene);
QList<QGraphicsItem *> items = scene->selectedItems();
if ( items.count() == 1 ){
GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
if ( item != 0 ){
nDragHandle = item->hitTest(event->scenePos());
if ( nDragHandle !=SizeHandleRect::None)
{
QPointF origin = item->mapToScene(item->boundingRect().center());
qreal len_y = c_last.y() - origin.y();
qreal len_x = c_last.x() - origin.x();
qreal angle = atan2(len_y,len_x)*180/PI;
lastAngle = angle;
selectMode = rotate;
if (dashRect ){
scene->removeItem(dashRect);
delete dashRect;
dashRect = 0;
}
dashRect = new QGraphicsPathItem(item->shape());
dashRect->setPen(Qt::DashLine);
dashRect->setPos(item->pos());
dashRect->setTransformOriginPoint(item->transformOriginPoint());
dashRect->setTransform(item->transform());
dashR
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
drawcli.7z (34个子文件)
drawcli
drawcli.pro 539B
drawscene.h 714B
image
ok.png 979B
bold.png 353B
pointer.png 230B
underline.png 307B
floodfill.png 282B
sendtoback.png 318B
save-5.png 946B
rotation.png 2KB
textpointer.png 893B
bringtofront.png 293B
background4.png 96B
rectangle.png 690B
italic.png 299B
linepointer.png 141B
background1.png 3KB
delete.png 831B
background2.png 114B
circle.png 1KB
background3.png 2KB
linecolor.png 145B
sizehandle.h 1KB
drawtool.h 2KB
drawobj.cpp 12KB
resource.qrc 823B
sizehandle.cpp 2KB
main.cpp 203B
mainwindow.ui 5KB
drawtool.cpp 12KB
mainwindow.cpp 5KB
mainwindow.h 760B
drawscene.cpp 1KB
drawobj.h 2KB
共 34 条
- 1
资源评论
友善吧!朋友
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功