[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