2017-12-04 32 views
1

이 이미지처럼 사각형 모양과 타원형 모양을 그리려면 어떻게해야합니까? 단일 선 테두리가있는 사각형 모양과 타원 모양을 만드는이 코드에서이 주어진 이미지와 같은 테두리 스타일을 변경해야합니다.QGraphicsItem 테두리 스타일

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
    ui->setupUi(this); 
    scene = new QGraphicsScene(this); 
    ui->graphicsView->setScene(scene); 

    QBrush redBrush(Qt::red); 
    QBrush blueBrush(Qt::blue); 
    QPen blackPen(Qt::black); 
    blackPen.setWidth(6); 

    //rect = scene->addRect(25,25,Qt::RelativeSize); 
    elipse = scene->addEllipse(20,20,100,100,blackPen,redBrush); 
    elipse->setFlag(QGraphicsItem::ItemIsMovable, true); 
    rect = scene->addRect(-20,-10,200,100,blackPen,blueBrush); 
    rect->setFlag(QGraphicsItem::ItemIsMovable, true); 
    rect->setFlag(QGraphicsItem::ItemIsSelectable,true); 
} 

Expected Result image

답변

1

이러한 속성은 Qt는이 제공하는 QGraphicsItem이없는, 우리가해야 할 우리의 사용자 정의 QGraphicsItem을 만드는 것입니다.

dgraphicsitem.h 다음

#ifndef DGRAPHICSITEM_H 
#define DGRAPHICSITEM_H 

#include <QGraphicsRectItem> 
#include <QPainter> 

class DGraphicsEllipseItem : public QGraphicsEllipseItem 
{ 
public: 
    DGraphicsEllipseItem(const QRectF &rect, qreal radius, QGraphicsItem *parent = nullptr): 
     QGraphicsEllipseItem(rect, parent){ 
     mRadius = radius; 
    } 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ 
     QGraphicsEllipseItem::paint(painter, option, widget); 
     painter->setBrush(brush()); 
     QRectF r = rect(); 
     r.setSize(r.size()-mRadius*QSizeF(1, 1)); 
     r.translate(mRadius*QPointF(1, 1)/2); 
     painter->drawEllipse(r); 
    } 
private: 
    qreal mRadius; 
}; 

class DGraphicsRectItem : public QGraphicsRectItem 
{ 
public: 
    DGraphicsRectItem(const QRectF &rect, qreal radius, QGraphicsItem *parent = nullptr): 
     QGraphicsRectItem(rect, parent){ 
     mRadius = radius; 
    } 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ 
     QGraphicsRectItem::paint(painter, option, widget); 
     painter->setBrush(brush()); 
     QRectF r = rect(); 
     r.setSize(r.size()-mRadius*QSizeF(1, 1)); 
     r.translate(mRadius*QPointF(1, 1)/2); 
     painter->drawRect(r); 
    } 
private: 
    qreal mRadius; 
}; 
#endif // DGRAPHICSITEM_H 

이 장면에 추가됩니다 :

scene = new QGraphicsScene(this); 
ui->graphicsView->setScene(scene); 

QBrush brush(Qt::white); 
QPen pen(Qt::green); 
pen.setWidth(1); 

DGraphicsEllipseItem* ellipse = new DGraphicsEllipseItem(QRectF(20,20, 200,100), 10); 
scene->addItem(ellipse); 
ellipse->setPen(pen); 
ellipse->setBrush(brush); 
ellipse->setFlag(QGraphicsItem::ItemIsMovable, true); 

DGraphicsRectItem* rect = new DGraphicsRectItem(QRectF(-20,-10,200,100), 10); 
scene->addItem(rect); 
rect->setPen(pen); 
rect->setBrush(brush); 
rect->setFlag(QGraphicsItem::ItemIsMovable, true); 

출력 :

enter image description here

의 옵션은 표준 클래스에서 상속하는 것입니다

com 예 : link에서 찾을 수 있습니다.

+0

정말 대단하다 !!! 대단히 감사합니다. – Learner

+0

선생님, 저에게이 문제에 대한 해결책을 줄 수 있습니까? https://stackoverflow.com/questions/47728237/how-can-i-change-qgraphicsview-background-using-check-box/ – Learner