在图形视图中剪切复制粘贴

时间:2014-10-15 19:38:50

标签: c++ qt qgraphicsview

我有5个实体可以在鼠标事件和按钮点击的图形视图中添加。已为每个实体分配了唯一ID。我需要添加操作剪切,复制和粘贴 这些实体。如何处理。我没有得到任何关于剪切,复制粘贴操作的例子在Qt中的图形视图中。我怎么能这样做?

我为所有实体设置了不同的类,我的类行,圆和椭圆是从QGraphicsItem继承的,以及来自QgraphicsLineItem和QgraphicsEllipse Item的行和文本。请告诉我如何与他们合作。 line.cpp

#include "line.h"

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

    // set values of start point and end point of line
    startP = p1;
    endP = p2;
}

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

QRectF Line::boundingRect() const
{
    qreal extra = 1.0;

    // bounding rectangle for line
    return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(),
                                      line().p2().y() - line().p1().y()))
            .normalized()
            .adjusted(-extra, -extra, extra, extra);
}

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

    if (isSelected())
    {
        // sets brush for end points
        painter->setBrush(Qt::SolidPattern);
        paintpen.setColor(Qt::red);
        painter->setPen(paintpen);
        painter->drawEllipse(startP, 2, 2);
        painter->drawEllipse(endP, 2, 2);

        // sets pen for line path
        paintpen.setStyle(Qt::DashLine);
        paintpen.setColor(Qt::black);
        painter->setPen(paintpen);
        painter->drawLine(startP, endP);
    }
    else
    {
        painter->setBrush(Qt::SolidPattern);
        paintpen.setColor(Qt::black);
        painter->setPen(paintpen);
        painter->drawEllipse(startP, 2, 2);
        painter->drawEllipse(endP, 2, 2);
        painter->drawLine(startP, endP);
    }
}

如何使用此QGraphicsLineItem?

1 个答案:

答案 0 :(得分:1)

我认为你应该使用自定义图形场景。创建QGraphicsScene子类。重新实现keyPressEvent:

if (e->key() == Qt::Key_C && e->modifiers() & Qt::ControlModifier)
{
           listCopiedItems =  this->selectedItems();
}
 
 
if (e->key() == Qt::Key_V && e->modifiers() & Qt::ControlModifier)
{
           for(int i=0; i< listCopiedItems.count(); i++)
           {
              //create new objects, set position and properties 
           }
}

您可以从旧对象获取所有需要的属性,例如颜色,大小等,并设置为new。对于剪切做同样的事情,但从场景中删除旧对象,当完成所有工作后,从内存中删除此对象。您还可以使用QShortcut类创建快捷方式。

编辑。我想说这是一个非常复杂的任务,所以我无法为所有类型的所有情况提供代码。我举一个例子,但这个例子有效(我测试了它)。我在这里发布绝对完整的代码。

部首:

#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H

#include <QGraphicsScene>
#include <QStack>
#include <QPoint>
#include <QMouseEvent>
class GraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit GraphicsScene(QObject *parent = 0);

signals:

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);
public slots:
    private:

    QList<QGraphicsItem *> lst; QPoint last;
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    QVector<QGraphicsEllipseItem * > vec;

    };

#endif // GRAPHICSSCENE_H

.cpp的:

#include "graphicsscene.h"
#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsItem>

GraphicsScene::GraphicsScene(QObject *parent) :
    QGraphicsScene(parent)
{

//add something
addPixmap(QPixmap("G:/2/qt.jpg"));

vec.push_back(addEllipse(0,0,50,50,QPen(Qt::red),QBrush(Qt::blue)));
vec.push_back(addEllipse(0+100,0+100,50,50,QPen(Qt::red),QBrush(Qt::blue)));
vec.push_back(addEllipse(0+150,0+150,50,50,QPen(Qt::red),QBrush(Qt::blue)));
}

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    //qDebug() << "in";
    if (mouseEvent->button() == Qt::LeftButton)
    {
        last = mouseEvent->scenePos().toPoint();//remember this point, we need it for copying
        QGraphicsItem *item = itemAt(mouseEvent->scenePos(), QTransform());
        item->setFlags(QGraphicsItem::ItemIsSelectable);
        item->setSelected(!item->isSelected());
    }
    QGraphicsScene::mousePressEvent(mouseEvent);
}

void GraphicsScene::keyPressEvent(QKeyEvent *e)
{
    if (e->key() == Qt::Key_C && e->modifiers() & Qt::ControlModifier)
    {
        lst = this->selectedItems();
    }

    if (e->key() == Qt::Key_V && e->modifiers() & Qt::ControlModifier)
    {
               for(int i=0; i< lst.count(); i++)
               {
                  //if it is ellipse
                   QGraphicsEllipseItem *ell = qgraphicsitem_cast<QGraphicsEllipseItem *>(lst.at(i));
                   if(ell)
                   {//then add ellipse to scene with ell properties and new position
                        addEllipse(QRect(last,ell->rect().size().toSize()),ell->pen(),ell->brush());
                           qDebug() << "good";
                   }

               }
    }


    QGraphicsScene::keyPressEvent(e);
}

它非常复杂,因为您没有任何clone()方法,因此您无法克隆具有所有属性的对象并将其移动到新位置。如果你有特定的项目,你应该提供具体的东西。这就是为什么它很复杂,我无法获得所有情况的代码。

修改

你无法显示场景,你应该使用它:

QGraphicsView vview;
GraphicsScene ss;
vview.setScene(&ss);
vview.show();