PDA

View Full Version : Problem inherit from QGraphicItem



xiongxiongchuan
12th August 2013, 16:08
i inherit form QGraphicsitem.but it dosen't show on my QGraphicsView,

#ifndef LINEITEM_H
#define LINEITEM_H

#include <QGraphicsItem.>
#include <QPen>
#include <QPainter>

class LineItem :public QGraphicsItem
{


public:
LineItem( QGraphicsItem * parent = 0);
LineItem( const QLineF & line, QGraphicsItem * parent = 0 );
LineItem( qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem * parent = 0 );
~LineItem();
//
QLineF line ( ) const;
QPen getPen()const;
void setLine( const QLineF & line );
void setLine( qreal x1, qreal y1, qreal x2, qreal y2 );
void setPen( const QPen & pen );

QRectF boundingRect() const;
void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 );
QPainterPath shape () const ;


private:
QPointF startPoint;
QPointF centerPoint;
QPointF endPoint;

QPen pen;

};

#endif // LINEITEM_H



#include "LineItem.h"

LineItem::LineItem( QGraphicsItem * parent)
: QGraphicsItem( parent)
{

}

LineItem::LineItem( const QLineF & line, QGraphicsItem * parent ):QGraphicsItem(parent)
{
startPoint=line.p1();
endPoint=line.p2();
centerPoint=QPointF((startPoint.x()+endPoint.y())/2,(startPoint.y()+endPoint.y())/2);
pen=QPen(Qt::black);
}

LineItem::LineItem( qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem * parent /* = 0 */ ):QGraphicsItem(parent)
{
startPoint=QPointF(x1,y1);
endPoint=QPointF(x2,y2);
centerPoint=QPointF((x1+x2)/2,(y1+y2)/2);
}


LineItem::~LineItem()
{

}

QRectF LineItem::boundingRect() const
{
return QRectF(startPoint,endPoint);

}

QPainterPath LineItem::shape() const
{
QPainterPath path;
path.addRect(QRectF(startPoint,endPoint));
return path;
}

QPen LineItem::getPen() const
{
return pen;
}

void LineItem::setPen( const QPen & pen )
{
this->pen=pen;
}

void LineItem::setLine( const QLineF & line )
{
startPoint=line.p1();
endPoint=line.p2();
centerPoint=QPointF((startPoint.x()+endPoint.y())/2,(startPoint.y()+endPoint.y())/2);
}

void LineItem::setLine( qreal x1, qreal y1, qreal x2, qreal y2 )
{
startPoint=QPointF(x1,y1);
endPoint=QPointF(x2,y2);
}

void LineItem::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget /* = 0 */ )
{
/*painter->setPen(QPen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin));
painter->drawRect(startPoint.x()-2,startPoint.y(),4,4);*/
//painter->drawPoint(startPoint);
//painter->drawPoint(endPoint);
//painter->drawPoint(centerPoint);

painter->setPen(Qt::blue);
painter->setFont(QFont("Arial", 30));
painter->drawText(QRectF(startPoint,endPoint), Qt::AlignCenter, "Qt");

}

karankumar1609
12th August 2013, 16:28
use QGraphicsScene addItem method, this method will add your item to scene and make it visible on your QGraphicsView.



QGraphicsView *view = new QGraphicsView();
// set the view rect

QGraphicsScene *scene = new QGraphicsScene();

// Set the scene Rect
// scene->setSceneRect(0, 0, 400, 400);

view->setScene(scene);

LineItem *L1 = new LineItem();
L1->setLine(0, 0, 100, 100);

scene->addItem(L1);



If this will not solve your problem then paste your code where you add LineItem to scene.

xiongxiongchuan
13th August 2013, 07:00
i have added it to view,but it did't show on the view



#ifndef FILLVIEW_H
#define FILLVIEW_H

#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QGraphicsLineItem>
#include "GraphicsItem/LineItem.h"
enum ShapeName{
Line, //线(å¹¶éžåˆ©ç”¨è´å¡žå° æ›²çº¿ç»˜åˆ¶è€Œæˆ)
Rectangle, //矩形
Circle, //æ ‡å‡†åœ†
Triangle, //三角形
Ellipse, //æ¤*圆
BezierCurve, //贝塞尔曲线
Control //控制
};


class FillView : public QGraphicsView
{
Q_OBJECT

public:
FillView(QWidget *parent);
~FillView();



QPainter* ItemPainter;

void mouseMoveEvent ( QMouseEvent * event ) ;
void mouseReleaseEvent ( QMouseEvent * event );
void mousePressEvent ( QMouseEvent * event ) ;
void wheelEvent ( QWheelEvent * event ) ;


QString getDrawingType()
{
return drawingType;
};
void ShowBackGroundGrid(bool show)
{
BackGroundGridVisible=show ;
}

bool GetBackGroundVisble()
{
return BackGroundGridVisible;
}


public slots:
void setCurrentShape(ShapeName s);
signals:
void getXY(float x,float y);
private:
void scaledBy(double factor);
QString drawingType;
QPointF beginPoint;
QPointF endPoint;
bool BackGroundGridVisible;
QGraphicsLineItem* line;
LineItem *ll;
QGraphicsEllipseItem *circle;
ShapeName currentShapeName;


public:







};




#endif // FILLVIEW_H




#include "fillview.h"
#include <QDebug>
#include <QTime>
#include <QMouseEvent>
#include <QGraphicsEllipseItem>

FillView::FillView(QWidget *parent)
: QGraphicsView(parent)
{
this->setDragMode(QGraphicsView::DragMode::RubberBandDra g);
setMouseTracking(true);

setRenderHints(QPainter::Antialiasing
| QPainter::TextAntialiasing);
setContextMenuPolicy(Qt::ActionsContextMenu);
line=new QGraphicsLineItem(beginPoint.x(),beginPoint.y(),be ginPoint.x(),beginPoint.y() );


// scene()->addItem(&item);
}


FillView::~FillView()
{

}

void FillView::setCurrentShape(ShapeName s)
{
currentShapeName=s;
if (s!=ShapeName::Control)
{
this->setCursor(Qt::CrossCursor);
}else
{
this->setCursor(Qt::CursorShape::ArrowCursor);
}


}

void FillView::mousePressEvent( QMouseEvent * event )
{
beginPoint=mapToScene(event->pos());
// BoundaryPoint(beginPoint.toPoint());
switch(currentShapeName)
{

case ShapeName::Line:
{
ll=new LineItem(beginPoint.x(),beginPoint.y(),beginPoint. x(),beginPoint.y() );
ll->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
scene()->addItem(line);
break;
}
case ShapeName::Circle:
{
circle=new QGraphicsEllipseItem(beginPoint.x(),beginPoint.y() ,0,0);
circle->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);

scene()->addItem(circle);
break;
}
}


}
void FillView::mouseReleaseEvent(QMouseEvent * event)
{

endPoint=mapToScene( event->pos());
// BoundaryPoint(endPoint.toPoint());
switch(currentShapeName)
{

case ShapeName::Line:
{
ll->setLine(beginPoint.x(),beginPoint.y(),endPoint.x() ,endPoint.y());
break;
}
case ShapeName::Circle:
{
double x = this->endPoint.x() - this->beginPoint.x();
double y = this->endPoint.y() - this->beginPoint.y();

double radius = sqrt(x * x + y * y);
circle->setRect(this->beginPoint.x() -radius,
this->beginPoint.y() - radius,radius*2,radius*2);
break;
}
}




}
void FillView::mouseMoveEvent ( QMouseEvent * mevent )
{

if (mevent->buttons()==Qt::LeftButton )
{
endPoint=mapToScene(mevent->pos());
// BoundaryPoint(endPoint.toPoint());

switch(currentShapeName)
{

case ShapeName::Line:
{
ll->setLine(beginPoint.x(),beginPoint.y(),endPoint.x() ,endPoint.y());
break;
}
case ShapeName::Circle:
{
double x = this->endPoint.x() - this->beginPoint.x();
double y = this->endPoint.y() - this->beginPoint.y();

double radius = sqrt(x * x + y * y);
circle->setRect(this->beginPoint.x() -radius,
this->beginPoint.y() - radius,radius*2,radius*2);
break;
}
}
}


//qDebug() <<"X:"<<mevent->pos().x()<<"Y:"<<mevent->pos().y()<<QTime::currentTime().toString() ;
QPointF pos=mapToScene(QPoint(mevent->pos().x(),mevent->pos().y()));
if (this->scene()->sceneRect().contains(pos))
{
emit getXY(pos.x(),pos.y());
// setCursor(Qt::CursorShape::ArrowCursor);
}
else
{
QPointF posn=pos;
if (posn.x()>sceneRect().width())
{
posn.setX(sceneRect().width());
}
if (posn.y()>sceneRect().height())
{
posn.setY(sceneRect().height());
}

if (posn.x()<0)
{
posn.setX(0);
}
if (posn.y()<0)
{
posn.setY(0);
}
emit getXY(posn.x(),posn.y());
//setCursor(Qt::CursorShape::ForbiddenCursor);
}


if (mevent->buttons()==Qt::LeftButton)
{
endPoint=mapToScene(mevent->pos());
QRectF rect(beginPoint,endPoint);

}

}

void FillView::wheelEvent( QWheelEvent * e )
{
if (e->modifiers().testFlag(Qt::ControlModifier)){ // zoom only when CTRL key pressed

int numSteps = e->delta() / 15 / 8;

if (numSteps == 0) {
e->ignore();
return;
}
qreal sc = pow(1.25, numSteps); // I use scale factor 1.25
this->scale(sc,sc);


e->accept();
}
}

void FillView::scaledBy(double factor)
{

}







Added after 1 33 minutes:

thank you ,i goti it

wagmare
13th August 2013, 07:51
ur scene() ins still empty ..
use like this


QRectF sceneRect( preferred Geometry)

QGraphicsScene *scene = new QGraphicsScene(sceneRect);

addScene(scene);