2014-11-07 2 views
0

점, 원, 타원, 선 및 텍스트와 같은 서로 다른 엔트리에 잘라 내기 복사 및 붙여 넣기 작업을 구현하고 있습니다. 내가 포인트를 구현했지만 다른 엔티티에 대해 동일한 절차를 수행하면 작동하지 않습니다. 이유를 모르겠다. 이 혼란을 해결하기 위해 나를 도와주세요.qgraphicsView에 붙여 넣기 작업 복사

cadgraphicsscene.cpp

void CadGraphicsScene::cut() 
{ 
    foreach (QGraphicsItem *item, itemList) 
    { 
     if (item->isSelected()) 
     { 
      // Cuts the selected item 
      removeItem(item); 
      update(); 
     } 
    } 

} 

void CadGraphicsScene::copy() 
{ 
    foreach (QGraphicsItem *item, itemList) 
    { 
     QString str; 
     // Stores the Point 
     if (item->isSelected() == Point::Type) 
     { 
      str = QString("Point copy p(%1,%2)") 
        .arg(item->x()) 
        .arg(item->y()); 
     } 

     if (item->isSelected() == Circle::Type) 
     { 
      Circle *circleItem = dynamic_cast<Circle *>(item); 
      str = QString("Circle copy c(%1,%2) r(%3)") 
        .arg(circleItem->center_p.x()) 
        .arg(circleItem->center_p.y()) 
        .arg(circleItem->radius); 
     } 
    } 
} 

void CadGraphicsScene::paste() 
{ 
    foreach (QGraphicsItem *item, itemList) 
    { 
     // Calls setNewItem function 
     setNewItem(item); 
    } 
} 

void CadGraphicsScene::setNewItem(QGraphicsItem *item) 
{ 
    static int id = 0; 
    if(item->isSelected() == PointMode) 
    { 
     // Create a New point 
     pointItem = new Point(++id); 
     pointItem->setPos(item->scenePos()); 
     itemList.append(pointItem); 
     mUndoStack->push(new CadCommandAdd(this, pointItem)); 
    } 

    if(item->isSelected() == CircleMode) 
    { 
     // Create a New point 
     circleItem = new Circle(id, start_p, _rad); 
     itemList.append(circleItem); 
     mUndoStack->push(new CadCommandAdd(this, circleItem)); 
    } 
} 

point.cpp

#include "point.h" 

Point::Point(int i) 
{ 
    // assigns id 
    id = i; 
} 

int Point::type() const 
{ 
    // Enable the use of qgraphicsitem_cast with point item. 
    return Type; 
} 

QRectF Point::boundingRect() const 
{ 
    // bounding rectangle for point 
    qreal penwidth = 1; 
    return QRectF(-1 - penwidth /2, -1 - penwidth/2, 
        2 + penwidth, 2 + penwidth); 
} 

void Point::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, 
        QWidget *widget) 
{ 
    // draws/paints the point 
    QPen paintpen; 
    if (isSelected()) 
     paintpen.setColor(Qt::red); 
    else 
     paintpen.setColor(Qt::black); 
    paintpen.setWidth(2); 
    painter->setRenderHint(QPainter::Antialiasing); 
    painter->setBrush(Qt::SolidPattern); 
    painter->setPen(paintpen); 
    painter->drawEllipse(boundingRect()); 
} 

이 항목은이 기능 QGraphicsItem::itemIsSelected는 의미

#include "circle.h" 

Circle::Circle(int i, QPointF p1, QPointF p2) 
{ 
    // assigns id 
    id = i; 

    /* set values of center point, end point 
    and calculate radius of circle */ 
    center_p = p1; 
    end_p = p2; 
    radius = qSqrt(qPow((end_p.x()-center_p.x()), 2) 
        + qPow((end_p.y()-center_p.y()), 2)); 
} 

Circle::Circle(int i, QPointF p1, qreal rad) 
{ 
    // assigns id 
    id = i; 

    /* set values of center point 
     and radius of circle */ 
    center_p = p1; 
    radius = rad; 
} 

int Circle::type() const 
{ 
    // Enable the use of qgraphicsitem_cast with circle item. 
    return Type; 
} 

QRectF Circle::boundingRect() const 
{ 
    // bounding rectangle for circle 
    return QRectF((center_p.x()-radius), (center_p.y()-radius), 
        (2*radius), (2*radius)); 
} 

void Circle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, 
        QWidget *widget) 
{ 
    // draws/paints the path of circle 
    QPen paintpen(Qt::black); 
    paintpen.setWidth(1); 
    painter->setRenderHint(QPainter::Antialiasing); 

    if (isSelected()) 
    { 
     // sets brush for center point 
     painter->setBrush(Qt::SolidPattern); 
     paintpen.setColor(Qt::red); 
     painter->setPen(paintpen); 
     painter->drawEllipse(center_p, 2, 2); 

     // sets pen for circumference 
     paintpen.setStyle(Qt::DashLine); 
     paintpen.setColor(Qt::black); 
     painter->setBrush(Qt::NoBrush); 
     painter->setPen(paintpen); 
     painter->drawEllipse(center_p, radius, radius); 
    } 
    else 
    { 
     painter->setBrush(Qt::SolidPattern); 
     paintpen.setColor(Qt::black); 
     painter->setPen(paintpen); 
     painter->drawEllipse(center_p, 2, 2); 
     painter->setBrush(Qt::NoBrush); 
     painter->drawEllipse(center_p, radius, radius); 
    } 
} 

답변

0

입니다 circle.cpp 여부를 다음과 같이 내 코드는 현재 선택되어 bool 값을 반환합니다. 다음 줄을 호출 따라서

는 항목 유형을 확인하기위한 유효하지 않습니다 : -

if (item->isSelected() == Point::Type) 
if (item->isSelected() == Circle::Type) 

당신이 사용하는 기능을 항목 유형을 확인하려면 QGraphicsItem::type()