[Qt-interest] Problems with moving items around on QGraphicsView/scene

Mic J michael.cognacc at gmail.com
Thu Apr 28 09:51:38 CEST 2011


Hi i used the last few days struggling with the Qt graphicsview.
Something as simple as creating a view and scene.
Draw one item, then move it with the mouse.


My understanding is that if i use a GraphicsLineItem or GraphicsEllipseItem etc.
Then i don't have to reimplement boundingRect and shape.

I had to reimplement both, boundinbRect for not getting artifacts on the screen.
Shape so i could drag the item, ie it had an area that registered that
the mouse was over the item(s).



Here is my the smallest example, i have boundingrect and shape, but in
my opinion :)
I should be able to remove my reimplmentation of boundingRect and shape.
But then i cant move the item.

Can anyone see something i've missed? or did i misunderstand something.


Code

canvas(.hpp|.cpp)
------
#ifndef CANVAS_HPP
#define CANVAS_HPP

#include <QtGui>
#include <QWidget>
#include "canvasitem.hpp"



class Canvas : public QWidget
{
    Q_OBJECT

public:
    explicit Canvas(QWidget *parent = 0);
    ~Canvas();

    void addCanvasItem();


protected:
    //void mousePressEvent(QGraphicsSceneMouseEvent *event);

private:
     QGraphicsView *gv;
     QGraphicsScene *sc;
     QHBoxLayout *lay;

     //QList <CanvasItem *> canvasItems;
     void setupCanvasItem(CanvasItem *ci);
     //CanvasItem *ci;
     int seqNumber;
};

#endif // CANVAS_HPP


#include "canvas.hpp"
#include "canvasitem.hpp"

#include <QtGui>
#include <QGraphicsView>
#include <QGraphicsScene>

Canvas::Canvas(QWidget *parent) :
    QWidget(parent)

{
    gv = new QGraphicsView; //(0,0,1000,1000)
    sc = new QGraphicsScene(0,0, 600, 600);
    gv->setScene(sc);

    lay = new QHBoxLayout;

    lay->addWidget(gv);
    setLayout(lay);

    //QList <CanvasItem *> canvasItems;
    //CanvasItem *ci;
    //gv

    addCanvasItem();
    seqNumber = 0;


}

Canvas::~Canvas()
{

}

/*
void Canvas::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if (event->mouseButtonPress ==  )
}
*/

void Canvas::addCanvasItem()
{
CanvasItem *canvasItem = new CanvasItem;
canvasItem->setToolTip(QString("ci %1").arg(seqNumber) );
//->setText(tr("Node %1").arg(seqNumber + 1));
setupCanvasItem(canvasItem);

}


void Canvas::setupCanvasItem(CanvasItem *ci)
{
    ci->setPos(QPoint(80 + (100 * (seqNumber % 5)),
                        80 + (50 * ((seqNumber / 5) % 7))));
    sc->addItem(ci);
    ++seqNumber;

    sc->clearSelection();
    ci->setSelected(true);
    //bringToFront();
}


------


canvasitem(.hpp|.cpp)
------------------
#ifndef CANVASITEM_HPP
#define CANVASITEM_HPP

#include <QGraphicsRectItem>
#include <QVariant>


class CanvasItem : public QGraphicsRectItem
{
    //Q_OBJECT
public:
    explicit CanvasItem();

    QRectF boundingRect() const;
    //QPainterPath shape() const;
     void paint(QPainter *painter, const QStyleOptionGraphicsItem
*option, QWidget *widget);

signals:

protected:

    QVariant itemChange(GraphicsItemChange change, const QVariant &value);

public slots:

private:
    QRectF outlineRect() const;
    int roundness(double size) const;

    QString canvasItemText;

};

#endif // CANVASITEM_HPP


#include "canvasitem.hpp"

#include <QtGui>
#include <QPainter>

CanvasItem::CanvasItem() //(QGraphicsRectItem(*parent = 0) :
    //QGraphicsRectItem(parent)
{
    setFlags( ItemIsSelectable | ItemIsMovable | ItemIsFocusable);
    boundingRect();
}


QVariant CanvasItem::itemChange(GraphicsItemChange change, const
QVariant &value)
{
    if (change == ItemPositionChange)
    {

    }

    return QGraphicsItem::itemChange(change, value);
}

void CanvasItem::paint(QPainter *painter, const
QStyleOptionGraphicsItem *option, QWidget *widget)
{
    //painter->setPen(QColor(Qt::green));
    painter->setBrush(QBrush(Qt::green));
    painter->drawRoundRect(0,0,10,10);

    //painter->drawRect();
}


QRectF CanvasItem::boundingRect() const
{
    const int Margin = 1;
    return outlineRect().adjusted(-Margin, -Margin, +Margin, +Margin);
}

/*
QPainterPath CanvasItem::shape() const
{
    QRectF rect = outlineRect();

    QPainterPath path;
    path.addRoundRect(rect, roundness(rect.width()),
                      roundness(rect.height()));
    return path;
}
*/


QRectF CanvasItem::outlineRect() const
{

    const int Padding = 8;
    QFontMetricsF metrics = qApp->font();
    QRectF rect = metrics.boundingRect(canvasItemText);
    rect.adjust(-Padding, -Padding, +Padding, +Padding);
    rect.translate(-rect.center());
    return rect;

}


int CanvasItem::roundness(double size) const
{
    const int Diameter = 12;
    return 100 * Diameter / int(size);
}

------------------

regards michael



More information about the Qt-interest-old mailing list