foreach:从'QGraphicsItem*'到'QGraphicsItemGroup*的转换无效

foreach: invalid conversion from 'QGraphicsItem*' to 'QGraphicsItemGroup*

本文关键字:无效 转换 QGraphicsItemGroup QGraphicsItem foreach      更新时间:2023-10-16

我在graphicsView中为qt中的不同实体(如点、椭圆、圆等)执行复制操作,但收到错误

 error: invalid conversion from 'QGraphicsItem*' to 'QGraphicsItemGroup*

我在cadgraphicsview.cpp中复制操作的代码是:

void CadGraphicsScene::copy()
{
    selectedItems.clear();
    foreach(QGraphicsItemGroup *item, itemList){
        QString str;
        if (item->isSelected())
        {
            if(item->type() == Point::Type)
            {
                Point *pointItem = (Point *) item;
                str = QString("Point %1 %2 ")
                        .arg(pointItem->scenePos().x())
                        .arg(pointItem->scenePos().y());
            }
            }
            }
    } 

在cadgraphicscene.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);
    void cut();
    void copy();
    void paste();
    void del();
protected:
     void contentsContextMenuEvent(QContextMenuEvent *event);
    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);
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;
    QAction *pasteAct;
};
#endif // CADGRAPHICSSCENE_H

帮我找到这个:)

您将itemList定义为:

QList<QGraphicsItem *> itemList;

然后您尝试使用对其进行迭代

foreach(QGraphicsItemGroup *item, itemList){
   // ...
}

从文档中,您可以看到QGraphicsItemGroup继承自QGraphicsItem。因此,每个QGraphicsItemGroup"都是一个"QGraphicsItem。但并不是每个QGraphicsItem"都是"QGraphicsItemGroup。

如果要迭代该itemList,则item必须是QGraphicsItem,或者itemList必须是QGraphicsItemGroup。看来,既然你在测试特定的类,那么前者可能就是你想要的。