#include "designerScene.h" #include "util/selectorManager.h" #include "graphicsItem/graphicsItemGroup.h" #include #include DesignerScene::DesignerScene(QObject *parent) : QGraphicsScene(parent) { m_bGridVisible = true; m_pView = nullptr; } DesignerScene::~DesignerScene() { } void DesignerScene::drawBackground(QPainter* painter, const QRectF& rect) { QGraphicsScene::drawBackground(painter, rect); painter->fillRect(sceneRect(), Qt::white); if(!m_bGridVisible) return; QRectF sceneRect = this->sceneRect(); QPen pen; pen.setBrush(Qt::darkCyan);//藏青色 pen.setStyle(Qt::DashLine); pen.setWidthF(0.2); painter->setPen(pen); int nGridSpace = 20; //暂时写死 //竖线 for(int nX = sceneRect.left(); nX < sceneRect.right(); nX += nGridSpace) painter->drawLine(nX,sceneRect.top(),nX,sceneRect.bottom()); //横线 for(int nY = sceneRect.top(); nY < sceneRect.bottom(); nY += nGridSpace) painter->drawLine(sceneRect.left(),nY,sceneRect.right(),nY); //补齐最后两条 painter->drawLine(sceneRect.right(), sceneRect.top(), sceneRect.right(), sceneRect.bottom()); painter->drawLine(sceneRect.left(), sceneRect.bottom(), sceneRect.right(), sceneRect.bottom()); //原点 // painter->setPen(Qt::red); // painter->setBrush(Qt::red); // painter->drawEllipse(0, 0, 50, 50); } void DesignerScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) { if(SelectorManager::getInstance()) { SelectorManager::getInstance()->getWorkingSelector()->mousePressEvent(mouseEvent, this); update(); } else QGraphicsScene::mousePressEvent(mouseEvent); } void DesignerScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) { if(SelectorManager::getInstance()) { SelectorManager::getInstance()->getWorkingSelector()->mouseMoveEvent(mouseEvent, this); update(); } else QGraphicsScene::mouseMoveEvent(mouseEvent); } void DesignerScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* mouseEvent) { if(SelectorManager::getInstance()) { SelectorManager::getInstance()->getWorkingSelector()->mouseReleaseEvent(mouseEvent, this); update(); } else QGraphicsScene::mouseReleaseEvent(mouseEvent); } void DesignerScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) { if(SelectorManager::getInstance()) { SelectorManager::getInstance()->getWorkingSelector()->mouseDoubleClickEvent(mouseEvent, this); update(); } else QGraphicsScene::mouseReleaseEvent(mouseEvent); } void DesignerScene::keyPressEvent(QKeyEvent* event) { QGraphicsScene::keyPressEvent(event); } void DesignerScene::keyReleaseEvent(QKeyEvent* event) { QGraphicsScene::keyReleaseEvent(event); } void DesignerScene::setGridVisible(bool bVisible) { m_bGridVisible = bVisible; update(); } void DesignerScene::callParentEvent(QGraphicsSceneMouseEvent* mouseEvent) { //调用QGraphicsScene的函数,会直接触发一些操作,比如取消item的selected状态,从而触发item的一些函数(itemChange),然后在item的相应函数中书写执行一些操作 switch (mouseEvent->type()) { case QEvent::GraphicsSceneMousePress: QGraphicsScene::mousePressEvent(mouseEvent); break; case QEvent::GraphicsSceneMouseMove: QGraphicsScene::mouseMoveEvent(mouseEvent); break; case QEvent::GraphicsSceneMouseRelease: QGraphicsScene::mouseReleaseEvent(mouseEvent); break; default: break; } } GraphicsItemGroup* DesignerScene::createGroup() { QList listItem = selectedItems(); if(listItem.isEmpty()) return nullptr; else if(listItem.count() == 1) //判断只选中了一个时是不是已经打组,如果是不做操作,防止循环打组 { AbstractShape* item = qgraphicsitem_cast(listItem.first()); if(item && item->getType()==T_group) return nullptr; } else //如果选择的有组群,则拆散该组群,并和其它单独的itme组合成新组群,防止多层组群出现,方便管理和计算 { for(int n=0; n(listItem[n]); if(shape && shape->getType()==T_group) { GraphicsItemGroup* group = qgraphicsitem_cast(listItem[n]); QList childItems = group->childItems(); foreach (QGraphicsItem* child, childItems) { if(qgraphicsitem_cast(child)) continue; group->removeFromGroup(child); listItem.push_back(child); } listItem.takeAt(n); removeItem(group); delete group; n--; } } } GraphicsItemGroup* group = new GraphicsItemGroup(); group->addItems(listItem); addItem(group); return group; } void DesignerScene::destroyGroup() { }