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 10.0k 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 https://stackoverflow.com/questions/29196610/qt-drawing-a-filled-rounded-rectangle-with-border

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

    @JoeCFD Thanks for your reply.
    I had seen that link but did not get how to use

    addRoundedRect()
    

    Because it is called by QPainterPath. And I do not have QPainterPath.

    And I am drawing rectangle through constructor.
    How to use QpainterPath in such case ?

    JonBJ JoeCFDJ 2 Replies Last reply
    0
    • T tushu

      @JoeCFD Thanks for your reply.
      I had seen that link but did not get how to use

      addRoundedRect()
      

      Because it is called by QPainterPath. And I do not have QPainterPath.

      And I am drawing rectangle through constructor.
      How to use QpainterPath in such case ?

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #4

      @tushu said in How to draw rectangle with all corners rounded ?:

      Because it is called by QPainterPath. And I do not have QPainterPath.

      Both the examples in the link show they create a QPainterPath as a local variable. The second one shows a complete paintEvent() override.

      And I am drawing rectangle through constructor.

      You can't. Drawing is done in paintEvent() as shown.

      EDIT I had not looked closely enough at your situation with graphics as opposed to the SO link for widgets. My bad.

      T 1 Reply Last reply
      0
      • JonBJ JonB

        @tushu said in How to draw rectangle with all corners rounded ?:

        Because it is called by QPainterPath. And I do not have QPainterPath.

        Both the examples in the link show they create a QPainterPath as a local variable. The second one shows a complete paintEvent() override.

        And I am drawing rectangle through constructor.

        You can't. Drawing is done in paintEvent() as shown.

        EDIT I had not looked closely enough at your situation with graphics as opposed to the SO link for widgets. My bad.

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

        @JonB Thanks for reply.
        I tried to create QPainterPath variable in constructor where I have rectangle co-ordinates. But I could not succeed.

        So another thought was to create in PaintEvent()
        But in my paintEvent() , how will I get co-ordinates of rectangle ?
        Because , it is virtual method, and does not accept co-ordinates in parameter.

        1 Reply Last reply
        0
        • T tushu

          @JoeCFD Thanks for your reply.
          I had seen that link but did not get how to use

          addRoundedRect()
          

          Because it is called by QPainterPath. And I do not have QPainterPath.

          And I am drawing rectangle through constructor.
          How to use QpainterPath in such case ?

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

          @tushu You are not drawing it in the constructor. Your code overrides paint func. Therefore, the rect is drawn in paint(). Since the code in the link needs only painter and you have it in the paint(), I guess you can do the same thing. There is no paintEvent() for QGraphicsRectItem.

          T 1 Reply Last reply
          0
          • JoeCFDJ JoeCFD

            @tushu You are not drawing it in the constructor. Your code overrides paint func. Therefore, the rect is drawn in paint(). Since the code in the link needs only painter and you have it in the paint(), I guess you can do the same thing. There is no paintEvent() for QGraphicsRectItem.

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

            @JoeCFD @JonB

            I have added following code in paint() , but did not get any effect.

            QRectF rect = QRectF(widget->rect());
            QPainterPath path;
            path.addRoundedRect(rect, 10, 10);
            
            JoeCFDJ 1 Reply Last reply
            0
            • T tushu

              @JoeCFD @JonB

              I have added following code in paint() , but did not get any effect.

              QRectF rect = QRectF(widget->rect());
              QPainterPath path;
              path.addRoundedRect(rect, 10, 10);
              
              JoeCFDJ Offline
              JoeCFDJ Offline
              JoeCFD
              wrote on last edited by JoeCFD
              #8

              @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 2 Replies 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 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

                                          • Login

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