2017-12-04 10 views
1

Wie kann ich eine rechteckige Form und ovale Form wie dieses Bild zeichnen.In diesem Code, der Rechteckform und ovale Form mit einer einzigen Linie border.Aber ich muss dort Rand Stil wie dieses gegebene Bild ändern.QGraphicsItem Border Styles

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

Antwort

1

Diese Eigenschaften haben nicht die QGraphicsItem dass Qt bietet, ist das, was wir tun müssen, unsere eigene QGraphicsItem erstellen. Eine Option ist von Klassen zu erben, die Standard sind:

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 

dann wird es zu der Szene hinzugefügt:

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); 

Ausgang:

enter image description here

Die com Ein Beispiel finden Sie in der folgenden link.

+0

Ihre wirklich tolle !!! Vielen Dank Sir – Learner

+0

Herr, können Sie mir eine Lösung für dieses Problem geben https://stackoverflow.com/questions/47728237/how-can-i-change-qgraphicsview-background-using-check-box/ – Learner