使用 Qt 类进行多重继承

Multiple inheritance with Qt classes

本文关键字:多重继承 Qt 使用      更新时间:2023-10-16

我有一个继承QGraphicsItem的类A,另一个继承QgraphicsLineItem的B类。B 如何继承 A 类

A类:公共QObject,公共QGraphicsItem {

}

类 B : 公共 QObject, 公共 QGraphicsLineItem {}

A 如何被 B 继承?

我的问题如下:

使用虚拟克隆方法()的类

#include <QGraphicsItem>
class getEntity : public QObject, public QGraphicsItem
{
public:
   getEntity(QObject *parent = 0) : QObject(parent) {}
   virtual ~getEntity() {}
   virtual getEntity *clone() { return 0; }
};

堆栈.h

#include <QStack>
#include "getEntity.h"
class clipboardStack
{
public:
    static clipboardStack *instance()
    {
        if (!inst)
            inst = new clipboardStack;
        return inst;
    }
    void push(getEntity *entity)
    {
        clips.push(entity);
    }
    getEntity *pasteEntity()
    {
        if (clips.count() == 0)
            return 0;
        return clips.last();
    }
    getEntity *pop()
    {
        if (clips.count() == 0)
            return 0;
        return clips.pop();
    }
    bool isEmpty() const
    {
        return clips.empty();
    }
private:
    QStack<getEntity *> clips;
    static clipboardStack *inst;
};

圆圈.h

#include <QPainter>
#include <QGraphicsItem>
#include "qmath.h"
#include "operations/getEntity.h"
#include "operations/clipboardstack.h"
class Circle : QGraphicsItem , public getEntity
{
    Q_OBJECT
public:
    Circle(QObject *parent = 0) : getEntity(parent) {}
    Circle(int, QPointF, QPointF);
    Circle(int, QPointF, qreal);
    QRectF boundingRect() const;
    virtual void paint(QPainter *painter,
                       const QStyleOptionGraphicsItem *option,
                       QWidget *widget);
    enum { Type = UserType + 3 };
    int type() const;
    int id;
    QPointF centerP, endP;
    qreal radius;
    getEntity *clone();
private:
    QVector<QPointF> stuff;
};

线路问题行.H

#include <QPainter>
#include <QGraphicsLineItem>
#include "operations/getEntity.h"
class Line : public QObject, public QGraphicsLineItem
{
    Q_OBJECT
public:
    Line(QObject *parent = 0) : getLine(parent) {}
    Line(int, QPointF, QPointF);
    QRectF boundingRect() const;
    virtual void paint(QPainter *painter,
                       const QStyleOptionGraphicsItem *option,
                       QWidget *widget);
    enum { Type = UserType + 2 };
    int type() const;
    int id;
    QPointF startP, endP;

private:
    QVector<QPointF> stuff;
};

CADGRAPHICSSCENE .cpp

 void CadGraphicsScene::cutEntity(getEntity *obj)
{
    removeItem(obj);
    clipboardStack::instance()->push(obj);
}
void CadGraphicsScene::copyEntity(getEntity *obj)
{
    clipboardStack::instance()->push(obj->clone());
}
void CadGraphicsScene::pasteEntity(const QPointF &pos)
{
    getEntity *pasteEntity = clipboardStack::instance()->pop();
    if (pasteEntity)
    {
        addItem(dynamic_cast<QGraphicsItem *>(pasteEntity));
        pasteEntity->setPos(pos);
        pasteEntity->setFlag(QGraphicsItem::ItemIsSelectable);
        pasteEntity->setFlag(QGraphicsItem::ItemIsMovable);
        mUndoStack->push(new CadCommandAdd(this, pasteEntity));
    }
}

您可以使用 QGraphicsObject 代替 QGraphicsItem,后者为您提供所需的信号/插槽机制,而无需多重继承。

您在评论中还提到:-

[继承] 来自 QgraphicsLineItem 的行和来自 QgraphicsTextItem 的文本

与其扩展 QGraphicsLineItem 和 QGraphicsTextItem,不如从 QGraphicsItem 或 QGraphicsObject 继承,就像对圆、椭圆和点所做的那样。