How to draw rectangle with all corners rounded ?
-
@JoeCFD
Is the below line correct ?QRectF rect = QRectF(widget->rect());
because of the above line , it is creating bigger rectangle ?
But bigger rectangle ( outermost ) has curved corner. -
@JoeCFD
Your rectangle size suggestion worked.
Current output.Now I want to round corner of middle 5 rectangle only ( i.e. sw1,sw2,PD_blue, PD_green,PD_yellow)
But left side rectangle ( small ) also got changed and looking like circle.I think, I will need to set some flag and will have to decide, which rectangle's corner should be rounded.
But now main concern is PD_blue, PD_green,PD_yellow rectangles color is not visible.
I set their color, after creating rectangle using setBrush(). I do not set their color in paint(). After creating rectangle, if they are full filling some criteria, then I set color on them.
Why that color is not visible ?
Here is my paint()
void guiSchematicRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); QRectF rect = QRectF(_polyRect); QPainterPath path; path.addRoundedRect(rect, 4, 4); auto copied_option = *option; copied_option.state &= ~QStyle::State_Selected; auto selected = option->state & QStyle::State_Selected; painter->save(); if (selected) { painter->setBrush(Qt::NoBrush); painter->setPen(QPen(option->palette.windowText(), 1, Qt::SolidLine)); } else { painter->setPen(Qt::blue); } painter->drawPath(path); painter->restore(); }
-
@JoeCFD
Your rectangle size suggestion worked.
Current output.Now I want to round corner of middle 5 rectangle only ( i.e. sw1,sw2,PD_blue, PD_green,PD_yellow)
But left side rectangle ( small ) also got changed and looking like circle.I think, I will need to set some flag and will have to decide, which rectangle's corner should be rounded.
But now main concern is PD_blue, PD_green,PD_yellow rectangles color is not visible.
I set their color, after creating rectangle using setBrush(). I do not set their color in paint(). After creating rectangle, if they are full filling some criteria, then I set color on them.
Why that color is not visible ?
Here is my paint()
void guiSchematicRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); QRectF rect = QRectF(_polyRect); QPainterPath path; path.addRoundedRect(rect, 4, 4); auto copied_option = *option; copied_option.state &= ~QStyle::State_Selected; auto selected = option->state & QStyle::State_Selected; painter->save(); if (selected) { painter->setBrush(Qt::NoBrush); painter->setPen(QPen(option->palette.windowText(), 1, Qt::SolidLine)); } else { painter->setPen(Qt::blue); } painter->drawPath(path); painter->restore(); }
-
@JoeCFD
If I add below line in paint() , then I get my 3 rectangle ( PD_blue, PD_green, PD_yellow) with thier respective color.QGraphicsRectItem::paint(painter, &copied_option, widget);
BUt output I get like this :
Can you see the corners ? There is a round shape but it is getting overlapped.
What is the issue with this line ?
QGraphicsRectItem::paint(painter, &copied_option, widget);
With this I get color of remaining rectangle but could not see round shape at edge.
-
@JoeCFD
If I add below line in paint() , then I get my 3 rectangle ( PD_blue, PD_green, PD_yellow) with thier respective color.QGraphicsRectItem::paint(painter, &copied_option, widget);
BUt output I get like this :
Can you see the corners ? There is a round shape but it is getting overlapped.
What is the issue with this line ?
QGraphicsRectItem::paint(painter, &copied_option, widget);
With this I get color of remaining rectangle but could not see round shape at edge.
-
@tushu QGraphicsRectItem::paint(painter, &copied_option, widget); is to call the parent to paint the rect without round corners. Look at the example and this call is not needed.
@JoeCFD
You are correct.
But now problem is, after creating rectangle, for some of the rectangle, I am setting some colour withSetBrush()
And the color applied with above method, is not visible to the rectangle. They are appearing colorless.
Can we use paint() parameter in this case ?
paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Or is there any other way to solve this issue ?
-
@JoeCFD
You are correct.
But now problem is, after creating rectangle, for some of the rectangle, I am setting some colour withSetBrush()
And the color applied with above method, is not visible to the rectangle. They are appearing colorless.
Can we use paint() parameter in this case ?
paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Or is there any other way to solve this issue ?
-
myRect.h
class myRect : public QGraphicsRectItem { explicit myRect(QRectF &rectPoints, QGraphicsScene *_scene, QGraphicsItem *parent = nullptr) : QGraphicsRectItem(rectPoints, parent), _scene(_scene) {} }
myRect.cpp
void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget); QRectF rect = QRectF(_polyRect); QPainterPath path; path.addRoundedRect(rect, 4, 4); auto copied_option = *option; copied_option.state &= ~QStyle::State_Selected; auto selected = option->state & QStyle::State_Selected; painter->save(); if (selected) { painter->setBrush(Qt::NoBrush); painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine)); } else painter->setPen(Qt::blue); painter->drawPath(path); painter->restore(); } void myRect::CreateRect(QRectF rect) { this->_polyRect = rect; QPen mPen; mPen.setWidth(1); mPen.setBrush(Qt::blue); this->setPen(mPen); this->setFlag(QGraphicsItem::ItemIsSelectable); }
mySymbol.cpp
DrawSymbol() { QRectF Rect( co-ordinates ); myRect* rect = new myRect(Rect, _scene); rect->CreateRect(Rect); if( if it is power domain ) CreatePD(rect); } CreatePD(myRect* rect) { QColor pdColor{some color }; rect->setBrush(pdColor); }
Note : If I add following line in paint()
QGraphicsRectItem::paint(painter, &copied_option, widget);
then I can see my rectangle with color. But gets problem with rounded corner.
-
myRect.h
class myRect : public QGraphicsRectItem { explicit myRect(QRectF &rectPoints, QGraphicsScene *_scene, QGraphicsItem *parent = nullptr) : QGraphicsRectItem(rectPoints, parent), _scene(_scene) {} }
myRect.cpp
void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget); QRectF rect = QRectF(_polyRect); QPainterPath path; path.addRoundedRect(rect, 4, 4); auto copied_option = *option; copied_option.state &= ~QStyle::State_Selected; auto selected = option->state & QStyle::State_Selected; painter->save(); if (selected) { painter->setBrush(Qt::NoBrush); painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine)); } else painter->setPen(Qt::blue); painter->drawPath(path); painter->restore(); } void myRect::CreateRect(QRectF rect) { this->_polyRect = rect; QPen mPen; mPen.setWidth(1); mPen.setBrush(Qt::blue); this->setPen(mPen); this->setFlag(QGraphicsItem::ItemIsSelectable); }
mySymbol.cpp
DrawSymbol() { QRectF Rect( co-ordinates ); myRect* rect = new myRect(Rect, _scene); rect->CreateRect(Rect); if( if it is power domain ) CreatePD(rect); } CreatePD(myRect* rect) { QColor pdColor{some color }; rect->setBrush(pdColor); }
Note : If I add following line in paint()
QGraphicsRectItem::paint(painter, &copied_option, widget);
then I can see my rectangle with color. But gets problem with rounded corner.
-
-
@tushu said in How to draw rectangle with all corners rounded ?:
if they are full filling some criteria, then I set color on them.
Why that color is not visible ?fill your form first:
painter->fillPath(path, yourColor); -
@JoeCFD @mpergand
I am facing another small issue in paint()When I left click on any rectangular object, it's paint() runs. And it highlights that object perfectly.
But when I right click on object ( I have few Right mouse button options ) , paint() method runs, but it does not highlight that object.
Her is my paint()
void myRect::paint(QPainter *painter, QPainterPath path, const QStyleOptionGraphicsItem *option) { auto copied_option = *option; copied_option.state &= ~QStyle::State_Selected; auto selected = option->state & QStyle::State_Selected; if(selected) qDebug()<<"TRUE "; else qDebug()<<"FALSE "; painter->save(); if (selected) { qDebug()<<"In selected "; painter->setBrush(Qt::NoBrush); painter->setPen(QPen(option->palette.windowText(), 1, Qt::SolidLine)); qDebug()<<"Selected completing "; } else { painter->setPen(Qt::blue); qDebug()<<"NOT Selected"; } painter->drawPath(path); painter->restore(); }
I checked through qDebug statements, and I found that,
auto selected
variable has value false on Right click.( i.e. selected = false)
On left click, It works perfectly ( i.e. selected = true )
-
@JoeCFD @mpergand
I am facing another small issue in paint()When I left click on any rectangular object, it's paint() runs. And it highlights that object perfectly.
But when I right click on object ( I have few Right mouse button options ) , paint() method runs, but it does not highlight that object.
Her is my paint()
void myRect::paint(QPainter *painter, QPainterPath path, const QStyleOptionGraphicsItem *option) { auto copied_option = *option; copied_option.state &= ~QStyle::State_Selected; auto selected = option->state & QStyle::State_Selected; if(selected) qDebug()<<"TRUE "; else qDebug()<<"FALSE "; painter->save(); if (selected) { qDebug()<<"In selected "; painter->setBrush(Qt::NoBrush); painter->setPen(QPen(option->palette.windowText(), 1, Qt::SolidLine)); qDebug()<<"Selected completing "; } else { painter->setPen(Qt::blue); qDebug()<<"NOT Selected"; } painter->drawPath(path); painter->restore(); }
I checked through qDebug statements, and I found that,
auto selected
variable has value false on Right click.( i.e. selected = false)
On left click, It works perfectly ( i.e. selected = true )
@tushu That means you do not use right click to select your widget. I do not know if it is a good idea to add right click to this feature. If you want to add it, you have to override mouse event to catch mouse right click and then set selected to be true.