在Qt中复制时出错

在Qt中复制时出错,qt,Qt,我试图在qraphicsView中的qt中对所有项目(如点、圆、线、椭圆等)执行复制和粘贴操作,但出现错误: error: void value not ignored as it ought to be storedItem = createCopy(item); error: prototype for 'QGraphicsItem* CadGraphicsScene::createCopy(QGraphicsItem*)' does not match any in class 'Ca

我试图在qraphicsView中的qt中对所有项目(如点、圆、线、椭圆等)执行复制和粘贴操作,但出现错误:

 error: void value not ignored as it ought to be storedItem = createCopy(item);
 error: prototype for 'QGraphicsItem* CadGraphicsScene::createCopy(QGraphicsItem*)' does not match any in class 'CadGraphicsScene'"QGraphicsItem* CadGraphicsScene::createCopy(QGraphicsItem* item)"
我在CadGraphicscene中的代码是:

    void CadGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent* evt)
    {
        QList<QGraphicsItem*> itemsAt = items(evt->scenePos());
        QGraphicsItem* item = itemsAt.isEmpty() ? 0x00 : itemsAt.first();
        static QGraphicsItem* storedItem = 0x00;
        QMenu menu;
        if(item)
            {
                menu.addAction("Copy");
                menu.addAction("Cut");
            }

        if(storedItem)
           {
               menu.addAction("Paste");
           }

         QAction* action = menu.exec(evt->screenPos());
         if(action != 0x00)
             {
             if(action->text() == "Copy")
                     {
                 if(storedItem)
                                 delete storedItem;
                             storedItem = createCopy(item);
             }
                    else if(action->text() == "Cut")
                    {
                        if(storedItem)
                            delete storedItem;
                        storedItem = item;
                        removeItem(item);
                    }
                    else if(action->text() == "Paste")
                    {
                        QGraphicsItem* item = createCopy(storedItem);
                        if(item) {
                            addItem(item);
                            item->setPos(evt->scenePos());
                        }
                    }
                }
             }
QGraphicsItem* CadGraphicsScene::createCopy(QGraphicsItem* item)
{
    if(item == 0x00)
        return 0x00;

    if(item->type() == Point::Type) //PointItem
    {
        Point* rectItem = (Point*)item;
        Point* copy = new Point(item->parentItem());
        copy->setRect(rectItem->rect());
        copy->setPen(rectItem->pen());
        copy->setBrush(rectItem->brush());
        return copy;
    }

    if(item->type() == Line::Type) //LineItem
    {
        Line* rectItem = (Line*)item;
        Line* copy = new Line(item->parentItem());
        copy->setRect(rectItem->rect());
        copy->setPen(rectItem->pen());
        copy->setBrush(rectItem->brush());
        return copy;
    }

    if(item->type() == Circle::Type) //CircleItem
    {
        Circle* rectItem = (Circle*)item;
        Circle* copy = new Circle(item->parentItem());
        copy->setRect(rectItem->rect());
        copy->setPen(rectItem->pen());
        copy->setBrush(rectItem->brush());
        return copy;
    }

    if(item->type() == Ellipse::Type) //EllipseItem
    {
        Ellipse* rectItem = (Ellipse*)item;
        Ellipse* copy = new Ellipse(item->parentItem());
        copy->setRect(rectItem->rect());
        copy->setPen(rectItem->pen());
        copy->setBrush(rectItem->brush());
        return copy;
    }

    if(item->type() == mText::Type) //TextItem
    {
        mText* rectItem = (mText*)item;
        mText* copy = new mText(item->parentItem());
        copy->setRect(rectItem->rect());
        copy->setPen(rectItem->pen());
        copy->setBrush(rectItem->brush());
        return copy;
    }

    return 0x00;
}
void cadgraphicscene::contextMenuEvent(qgraphicscenecontextmenuevent*evt)
{
QList itemsAt=items(evt->scenePos());
QGraphicsItem*item=itemsAt.isEmpty()?0x00:itemsAt.first();
静态QGraphicsItem*storedItem=0x00;
QMenu菜单;
如果(项目)
{
菜单。添加操作(“复制”);
菜单。添加操作(“剪切”);
}
如果(storedItem)
{
menu.addAction(“粘贴”);
}
QAction*action=menu.exec(evt->screenPos());
如果(操作!=0x00)
{
如果(操作->文本()=“复制”)
{
如果(storedItem)
删除storedItem;
storedItem=createCopy(项目);
}
否则如果(操作->文本()=“剪切”)
{
如果(storedItem)
删除storedItem;
storedItem=项目;
移除项目(项目);
}
否则如果(操作->文本()=“粘贴”)
{
QGraphicsItem*item=createCopy(storedItem);
如果(项目){
增编(项目);
项目->设置位置(evt->scenePos());
}
}
}
}
QGraphicsSitem*CadGraphicscene::createCopy(QGraphicsSitem*项)
{
如果(项==0x00)
返回0x00;
如果(item->type()==Point::type)//PointItem
{
点*项=(点*)项;
点*复制=新点(项->父项());
复制->setRect(rectItem->rect());
复制->设置笔(rectItem->笔());
复制->收进(矩形项->画笔());
返回副本;
}
如果(item->type()==Line::type)//LineItem
{
行*项=(行*)项;
行*复制=新行(项->父项());
复制->setRect(rectItem->rect());
复制->设置笔(rectItem->笔());
复制->收进(矩形项->画笔());
返回副本;
}
if(item->type()==Circle::type)//CircleItem
{
圆圈*矩形项=(圆圈*)项;
循环*复制=新循环(项目->父项目());
复制->setRect(rectItem->rect());
复制->设置笔(rectItem->笔());
复制->收进(矩形项->画笔());
返回副本;
}
如果(项->类型()==EllipseItem::type)//EllipseItem
{
椭圆*矩形项=(椭圆*)项;
椭圆*复制=新椭圆(项->父项());
复制->setRect(rectItem->rect());
复制->设置笔(rectItem->笔());
复制->收进(矩形项->画笔());
返回副本;
}
如果(item->type()==mText::type)//TextItem
{
多行文字*矩形项=(多行文字*)项;
多行文字*复制=新多行文字(项目->父项目());
复制->setRect(rectItem->rect());
复制->设置笔(rectItem->笔());
复制->收进(矩形项->画笔());
返回副本;
}
返回0x00;
}
和CadScene.h是:

#ifndef CADGRAPHICSSCENE_H
#define CADGRAPHICSSCENE_H

#include <QGraphicsScene>
#include <QXmlStreamWriter>
#include <QUndoStack>
#include <QLabel>
#include <QFrame>

#include "cadcommandadd.h"
#include "cadcommanddelete.h"
#include "cadcommandmove.h"


class CadGraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit CadGraphicsScene(QObject *parent, QUndoStack *);
    enum Mode { NoMode, PointMode, LineMode, CircleMode, EllipseMode, TextMode };

    QFont font() const
    {
        return myFont;
    }

    QColor textColor() const
    {
        return myTextColor;
    }

    void setTextColor(const QColor &color);
    void setFont(const QFont &font);
    void deleteItems();
    void writeStream(QXmlStreamWriter *stream);
    void readStream(QXmlStreamReader *stream);


public slots:
    void setMode(Mode mode);
    void selectItems();
    void editorLostFocus(mText *item);


protected:
     void contextMenuEvent(QGraphicsSceneContextMenuEvent* evt);
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent);
    void setFlags();
    void areItemsSelectable(bool);
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void createCopy(QGraphicsItem* item);
signals:
    void textInserted(QGraphicsTextItem *item);
    void itemSelected(QGraphicsItem *item);

private:
    Mode entityMode;
    QUndoStack *mUndoStack;

    bool mFirstClick;
    bool mSecondClick;
    bool mThirdClick;
    bool mPaintFlag;
    QVector<QPointF> stuff;
    QPointF start_p, mid_p, end_p, move_p, check_p;
    QPen paintpen, linePen;

    QList<QGraphicsItem *> itemList;
    Point *pointItem;
    Line *lineItem;
    Circle *circleItem;
    Ellipse *ellipseItem;
    mText *textItem;
    QColor myTextColor;
    QFont myFont;

    typedef QPair<QGraphicsItem *, QPointF> itemPos;
    QList<itemPos> selectedItems;
private:
    QAction *cutAct;
    QAction *copyAct;

};

#endif // CADGRAPHICSSCENE_H
\ifndef cadgraphicscene\u H
#定义CadGraphicscene_H
#包括
#包括
#包括
#包括
#包括
#包括“cadcommandadd.h”
#包括“cadcommanddelete.h”
#包括“cadcommandmove.h”
类别CadGraphicscene:公共QGraphicscene
{
Q_对象
公众:
显式CadGraphicscene(QObject*父对象,QUndoStack*);
枚举模式{NoMode,PointMode,LineMode,CircleMode,EllipseMode,TextMode};
QFont font()常量
{
返回myFont;
}
QColor textColor()常量
{
返回myTextColor;
}
void setTextColor(常量QColor和color);
void setFont(const QFont&font);
作废删除项目();
void writeStream(QXmlStreamWriter*流);
void readStream(QXmlStreamReader*流);
公众时段:
无效设置模式(模式);
void selectItems();
无效编辑器关闭焦点(多行文字*项);
受保护的:
无效contextMenuEvent(QGraphicsContextMenuEvent*evt);
void mousePressEvent(QGraphicsSceneMouseEvent*mouseEvent);
无效mouseReleaseEvent(QGraphicsSceneMouseEvent*mouseEvent);
void setFlags();
无效项可选择(bool);
无效dragEnterEvent(QDragEnterEvent*事件);
作废事件(QDropEvent*事件);
作废鼠标压力事件(QMouseEvent*事件);
作废createCopy(QGraphicsItem*项);
信号:
插入的无效文本(QGraphicsTextItem*项);
已选择无效项(QGraphicsItem*项);
私人:
模式实体模式;
昆多斯塔克*蒙多斯塔克;
boolmfirstclick;
bool-mSecondClick;
bool-mThirdClick;
布尔姆帕因特旗;
矢量材料;
Q点开始、中间、结束、移动、检查;
QPen画笔、线条笔;
QList项目列表;
点*点项目;
行*行项目;
圆圈*圆圈;
椭圆*ellipseItem;
多行文字*文本项目;
QColor myTextColor;
QFont myFont;
typedef QPair itemPos;
QList-selectedItems;
私人:
行动*行动;
行动*模仿;
};
#endif//cadgraphicscene_H

请帮我找到这个。

您有不匹配的原型。在标题中返回
void
,但在源代码中返回
QGraphicsItem*
。这也是编译器试图编写的内容

镉烯 Cadscene.cpp 解决方案是将标题中的签名更改为:

Cadscene.h(固定)
您在头中返回void,因此签名与源文件中的签名不匹配。
void createCopy(QGraphicsItem* item);
QGraphicsItem* CadGraphicsScene::createCopy(QGraphicsItem* item)
QGraphicsItem* createCopy(QGraphicsItem* item);