Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to draw rectangle with all corners rounded ?
Forum Updated to NodeBB v4.3 + New Features

How to draw rectangle with all corners rounded ?

Scheduled Pinned Locked Moved Unsolved General and Desktop
31 Posts 4 Posters 9.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JoeCFDJ JoeCFD

    @tushu add print message or set break point there to check if the func is called. Also show your full code of this func.

    T Offline
    T Offline
    tushu
    wrote on last edited by tushu
    #9

    @JoeCFD
    my current output
    90a64852-026d-48f1-9ca9-e6f3137dc051-image.png

    And code in paint()

    void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        QRectF rect = QRectF(widget->rect());
        QPainterPath path;
        painter->drawRoundedRect(rect, 10, 10);
    auto copied_option = *option;
        copied_option.state &= ~QStyle::State_Selected;
        auto selected = option->state & QStyle::State_Selected;
        QGraphicsRectItem::paint(painter, &copied_option, widget);
        if (selected) {
            painter->save();
            painter->setBrush(Qt::NoBrush);
            painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine));
            painter->drawPath(shape());
            painter->restore();
        }
    
    1 Reply Last reply
    0
    • JoeCFDJ JoeCFD

      @tushu add print message or set break point there to check if the func is called. Also show your full code of this func.

      T Offline
      T Offline
      tushu
      wrote on last edited by
      #10

      @JoeCFD
      Some big rectangle is getting drawn.
      I think that is because of

      QRectF rect = QRectF(widget->rect());
      

      I am taking widget->rect().
      But I am expecting, every rectangle in the scene should have rounded corner.

      JoeCFDJ 1 Reply Last reply
      0
      • T tushu

        @JoeCFD
        Some big rectangle is getting drawn.
        I think that is because of

        QRectF rect = QRectF(widget->rect());
        

        I am taking widget->rect().
        But I am expecting, every rectangle in the scene should have rounded corner.

        JoeCFDJ Offline
        JoeCFDJ Offline
        JoeCFD
        wrote on last edited by JoeCFD
        #11

        @tushu

        Something like this.

        void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
        {
            QRectF rect = QRectF(widget->rect());
            QPainterPath path;
            path->drawRoundedRect(rect, 10, 10); /* path not painter */
            auto copied_option = *option;
            copied_option.state &= ~QStyle::State_Selected;
            auto selected = option->state & QStyle::State_Selected;
            //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* you do not call this one  */
            painter->save();
            if (selected) {
                painter->setBrush(Qt::NoBrush);
                painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine));
           }
           else {
               set pen color;
           }       
           painter->drawPath(path); 
           painter->restore();
        }
        
        T 1 Reply Last reply
        0
        • JoeCFDJ JoeCFD

          @tushu

          Something like this.

          void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
          {
              QRectF rect = QRectF(widget->rect());
              QPainterPath path;
              path->drawRoundedRect(rect, 10, 10); /* path not painter */
              auto copied_option = *option;
              copied_option.state &= ~QStyle::State_Selected;
              auto selected = option->state & QStyle::State_Selected;
              //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* you do not call this one  */
              painter->save();
              if (selected) {
                  painter->setBrush(Qt::NoBrush);
                  painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine));
             }
             else {
                 set pen color;
             }       
             painter->drawPath(path); 
             painter->restore();
          }
          
          T Offline
          T Offline
          tushu
          wrote on last edited by tushu
          #12

          @JoeCFD

          I have used

          painter.drawRoundedRect(rect, 10, 10);
          

          because QPainterPath does not have drawRoundedRect()

          current output

          5ed845a7-d434-4043-9bbd-5f058cdc6dac-image.png

          Below lines creating difference.

          //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* you do not call this one  */
          
          JoeCFDJ 2 Replies Last reply
          0
          • T tushu

            @JoeCFD

            I have used

            painter.drawRoundedRect(rect, 10, 10);
            

            because QPainterPath does not have drawRoundedRect()

            current output

            5ed845a7-d434-4043-9bbd-5f058cdc6dac-image.png

            Below lines creating difference.

            //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* you do not call this one  */
            
            JoeCFDJ Offline
            JoeCFDJ Offline
            JoeCFD
            wrote on last edited by JoeCFD
            #13

            @tushu

            void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
            {
                QRectF rect = QRectF(widget->rect());
                QPainterPath path;
                path->addRoundedRect(rect, 10, 10); /* add not draw sorry */
                auto copied_option = *option;
                copied_option.state &= ~QStyle::State_Selected;
                auto selected = option->state & QStyle::State_Selected;
                //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* drawing is finished here and no need to call parent->paint()  */
                painter->save();
                if (selected) {
                    painter->setBrush(Qt::NoBrush);
                    painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine));
               }
               else {
                   set pen color;
               }       
               painter->drawPath(path); 
               painter->restore();
            }
            
            T 1 Reply Last reply
            0
            • T tushu

              @JoeCFD

              I have used

              painter.drawRoundedRect(rect, 10, 10);
              

              because QPainterPath does not have drawRoundedRect()

              current output

              5ed845a7-d434-4043-9bbd-5f058cdc6dac-image.png

              Below lines creating difference.

              //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* you do not call this one  */
              
              JoeCFDJ Offline
              JoeCFDJ Offline
              JoeCFD
              wrote on last edited by
              #14

              @tushu You also need to try the example first

              void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
              {
              painter->setRenderHint(QPainter::Antialiasing);
              QPainterPath path;
              path.addRoundedRect(QRectF(10, 10, 100, 50), 10, 10);
              QPen pen(Qt::black, 10);
              painter->setPen(pen);
              painter->fillPath(path, Qt::red);
              painter->drawPath(path);
              }
              
              1 Reply Last reply
              0
              • JoeCFDJ JoeCFD

                @tushu

                void myRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
                {
                    QRectF rect = QRectF(widget->rect());
                    QPainterPath path;
                    path->addRoundedRect(rect, 10, 10); /* add not draw sorry */
                    auto copied_option = *option;
                    copied_option.state &= ~QStyle::State_Selected;
                    auto selected = option->state & QStyle::State_Selected;
                    //QGraphicsRectItem::paint(painter, &copied_option, widget);  /* drawing is finished here and no need to call parent->paint()  */
                    painter->save();
                    if (selected) {
                        painter->setBrush(Qt::NoBrush);
                        painter->setPen(QPen(option->palette.windowText(), 0, Qt::SolidLine));
                   }
                   else {
                       set pen color;
                   }       
                   painter->drawPath(path); 
                   painter->restore();
                }
                
                T Offline
                T Offline
                tushu
                wrote on last edited by
                #15

                @JoeCFD
                For this , getting the same above output.
                (i.e. No border of any rectangle)

                JoeCFDJ 1 Reply Last reply
                0
                • T tushu

                  @JoeCFD
                  For this , getting the same above output.
                  (i.e. No border of any rectangle)

                  JoeCFDJ Offline
                  JoeCFDJ Offline
                  JoeCFD
                  wrote on last edited by
                  #16

                  @tushu did you try the example?

                  T 2 Replies Last reply
                  0
                  • JoeCFDJ JoeCFD

                    @tushu did you try the example?

                    T Offline
                    T Offline
                    tushu
                    wrote on last edited by
                    #17

                    @JoeCFD

                    Example's output

                    d0017cbd-e8f8-45d1-83f7-bead1be99d3b-image.png

                    I have just removed

                    //painter->fillPath(path, Qt::red);
                    
                    1 Reply Last reply
                    0
                    • JoeCFDJ JoeCFD

                      @tushu did you try the example?

                      T Offline
                      T Offline
                      tushu
                      wrote on last edited by tushu
                      #18

                      @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.

                      JoeCFDJ 1 Reply Last reply
                      0
                      • T tushu

                        @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.

                        JoeCFDJ Offline
                        JoeCFDJ Offline
                        JoeCFD
                        wrote on last edited by
                        #19

                        @tushu you know the size of your rects, right? I do not know.

                        T 2 Replies Last reply
                        0
                        • JoeCFDJ JoeCFD

                          @tushu you know the size of your rects, right? I do not know.

                          T Offline
                          T Offline
                          tushu
                          wrote on last edited by tushu
                          #20

                          @JoeCFD
                          Your rectangle size suggestion worked.
                          Current output.

                          296e6f8c-ef10-4ecb-91bb-d7685fd8f2e5-image.png

                          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();
                          }
                          
                          M 1 Reply Last reply
                          0
                          • T tushu

                            @JoeCFD
                            Your rectangle size suggestion worked.
                            Current output.

                            296e6f8c-ef10-4ecb-91bb-d7685fd8f2e5-image.png

                            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();
                            }
                            
                            M Offline
                            M Offline
                            mpergand
                            wrote on last edited by
                            #21

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

                            T 1 Reply Last reply
                            1
                            • JoeCFDJ JoeCFD

                              @tushu you know the size of your rects, right? I do not know.

                              T Offline
                              T Offline
                              tushu
                              wrote on last edited by
                              #22

                              @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 :
                              423d4ef8-f783-4648-9fbe-61a8932099c7-image.png

                              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.

                              JoeCFDJ 1 Reply Last reply
                              0
                              • T tushu

                                @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 :
                                423d4ef8-f783-4648-9fbe-61a8932099c7-image.png

                                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.

                                JoeCFDJ Offline
                                JoeCFDJ Offline
                                JoeCFD
                                wrote on last edited by
                                #23

                                @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.

                                T 1 Reply Last reply
                                1
                                • JoeCFDJ JoeCFD

                                  @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.

                                  T Offline
                                  T Offline
                                  tushu
                                  wrote on last edited by
                                  #24

                                  @JoeCFD
                                  You are correct.
                                  But now problem is, after creating rectangle, for some of the rectangle, I am setting some colour with

                                  SetBrush()
                                  

                                  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 ?

                                  JoeCFDJ 1 Reply Last reply
                                  0
                                  • T tushu

                                    @JoeCFD
                                    You are correct.
                                    But now problem is, after creating rectangle, for some of the rectangle, I am setting some colour with

                                    SetBrush()
                                    

                                    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 ?

                                    JoeCFDJ Offline
                                    JoeCFDJ Offline
                                    JoeCFD
                                    wrote on last edited by
                                    #25

                                    @tushu can you show your full code of this func?

                                    T 1 Reply Last reply
                                    0
                                    • JoeCFDJ JoeCFD

                                      @tushu can you show your full code of this func?

                                      T Offline
                                      T Offline
                                      tushu
                                      wrote on last edited by tushu
                                      #26

                                      @JoeCFD

                                      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.

                                      JoeCFDJ 1 Reply Last reply
                                      0
                                      • T tushu

                                        @JoeCFD

                                        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.

                                        JoeCFDJ Offline
                                        JoeCFDJ Offline
                                        JoeCFD
                                        wrote on last edited by JoeCFD
                                        #27

                                        @tushu Check the example and @mpergand's reply. You do not have
                                        painter->fillPath(path, yourColor);
                                        Try to set yourColor = Qt::green to see what you get.

                                        T 2 Replies Last reply
                                        1
                                        • JoeCFDJ JoeCFD

                                          @tushu Check the example and @mpergand's reply. You do not have
                                          painter->fillPath(path, yourColor);
                                          Try to set yourColor = Qt::green to see what you get.

                                          T Offline
                                          T Offline
                                          tushu
                                          wrote on last edited by
                                          #28

                                          @JoeCFD
                                          Your suggestion worked.
                                          Thanks for help !

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved