0

Helo,在我当前的项目中,我遇到了在 QGraphicsScene 中选择 QAbstractGraphicsShapeItem 的问题,我执行以下操作:

QAbstractGraphicsShapeItem* i = canvas.addEllipse(QRectF(-radius,-radius,radius,radius));
i->setFlag(QGraphicsItem::ItemIsMovable);
i->setPen(Qt::NoPen);
i->setBrush( QColor(red, green , blue) );
i->setPos(x,y);
i->setZValue(qrand()%256);

画布在哪里 QGraphicsScene,因为我添加了标志 ItemIsMovable ,这允许拖动项目,但是当用户双击它们时我需要更改项目的颜色,有什么建议吗?

现在以下

class MyRectItem : public QObject, public QAbstractGraphicsShapeItem
{
    Q_OBJECT

public:

    MyRectItem(qreal x, qreal y, qreal w, qreal h) : QGraphicsRectItem(x,y,w,h)
    {}
signals:
    void selectionChanged(bool newState);
protected:
    QVariant itemChange(GraphicsItemChange change, const QVariant &value)
    {
        if (change == QGraphicsItem::ItemSelectedChange)
        {
            bool newState = value.toBool();
            emit selectionChanged(newState);
        }
        return QGraphicsItem::itemChange(change, value);
    }
};

并尝试从这里调用它

void Main::addCircle(int x, int y,int radius,int red, int green, int blue)
{
    MyRectItem *i = new MyRectItem(-50, -50, 50, 50);
    canvas.addItem(i);
    i->setFlag(QGraphicsItem::ItemIsSelectable);
    i->setPen(QPen(Qt::darkBlue));
}

并得到以下错误
../portedcanvas/canvas.cpp: In member function 'void Main::addCircle(int, int, int, int, int, int)': ../portedcanvas/canvas.cpp:233: error: cannot allocate an object of abstract type 'MyRectItem' ../portedcanvas/canvas.cpp:68: note: because the following virtual functions are pure within 'MyRectItem': ../../../../Desktop/Qt/4.8.0/gcc/lib/QtGui.framework/Versions/4/Headers/qgraphicsitem.h:331: note: virtual QRectF QGraphicsItem::boundingRect() const ../../../../Desktop/Qt/4.8.0/gcc/lib/QtGui.framework/Versions/4/Headers/qgraphicsitem.h:352: note: virtual void QGraphicsItem::paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*)

4

2 回答 2

0

您需要实现boundingRect()paint()在您的类中继承自QGraphicsItem(并且QAbstractGraphicsShapeItem因为它没有实现它们)

但是你应该只从一个具体的子类中继承你的类,QGraphicsRectItem因为那是你真正希望你的项目表现出来的。

于 2012-04-10T12:14:16.720 回答
0

不要使用 QGraphicsScene 的addEllipse便捷方法,而是将自己的 QGraphicsEllipseItem 子类化,然后重载mouseDoubleClickEvent以做任何你想做的事情。

所做addEllipse的只是为您创建对象并将其添加到场景中,然后将指针返回给您。当您创建 QGraphicsEllipseItem 子类的新实例时,您可以将场景作为父级传递给构造函数,或者addItem在场景中调用您的实例。

更新

我不是 C++ 专家,但似乎在您更新的代码示例中,您将抽象类子类化QAbstractGraphicsShapeItem只是为了添加一个重载。那个类是抽象的是有原因的。当您对它进行子类化时,您应该提供各种虚函数的实现,而您不是。我认为你应该做的是QGraphicsEllipseItem像我已经建议的那样直接子类化。

于 2012-04-10T05:53:45.190 回答