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. Maintaining aspect ratio of qlabel
Forum Updated to NodeBB v4.3 + New Features

Maintaining aspect ratio of qlabel

Scheduled Pinned Locked Moved Unsolved General and Desktop
22 Posts 4 Posters 6.5k Views 3 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.
  • KiraK Offline
    KiraK Offline
    Kira
    wrote on last edited by
    #1

    Hello,
    I am using the following example to implement QLabel
    https://stackoverflow.com/questions/42833511/qt-how-to-create-image-that-scale-with-window-and-keeps-aspect-ratio
    Problem:
    When I write the following syntax:
    _qPixmapScaled = _qPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    I get a complete view of the pixmap image, although it does not cover the complete label widgets, i.e., there is space on the corners.
    When I use Qt:: KeepAspectRatiobyExpanding, the pixmap occupies the complete label, but I do not get the full view of the pixmap ie, some part gets truncated. I have to resize the Qlabel to view the image.
    Requirement:
    I need to adjust the size of the label, keeping the complete view of the image. How can i achieve the following?

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi
      Just as a note.
      Keeping the aspect ratio of an image often leaves
      unused area when the numbers do not match.
      So its expected if you want to keep the aspect.

      KiraK 1 Reply Last reply
      0
      • mrjjM mrjj

        Hi
        Just as a note.
        Keeping the aspect ratio of an image often leaves
        unused area when the numbers do not match.
        So its expected if you want to keep the aspect.

        KiraK Offline
        KiraK Offline
        Kira
        wrote on last edited by
        #3

        @mrjj : thanks for the reply.
        Yes, I want to keep the aspect ratio.
        What are the possible solutions or workaround if I don't want the unused space.
        As I said earlier, Qt:: KeepAspectRatiobyExpanding often covers the unused area, but it does not display the whole pixmap, some of the regions get truncated.

        mrjjM 1 Reply Last reply
        0
        • KiraK Kira

          @mrjj : thanks for the reply.
          Yes, I want to keep the aspect ratio.
          What are the possible solutions or workaround if I don't want the unused space.
          As I said earlier, Qt:: KeepAspectRatiobyExpanding often covers the unused area, but it does not display the whole pixmap, some of the regions get truncated.

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Kira

          Well you can either accept that for some sizes there are unused space but
          image keeps its aspect or you can
          allow it to not keep aspect and complete fill the eare even if it slightly distorts the image.

          The KeepAspectRatiobyExpanding will make sure image uses all space but
          some of the image might be out side the area.

          SO you can either have it take all space or have it keep the aspect ratio.

          Its not possible to have both in the cases where the numbers do not match up.

          KiraK 1 Reply Last reply
          0
          • mrjjM mrjj

            @Kira

            Well you can either accept that for some sizes there are unused space but
            image keeps its aspect or you can
            allow it to not keep aspect and complete fill the eare even if it slightly distorts the image.

            The KeepAspectRatiobyExpanding will make sure image uses all space but
            some of the image might be out side the area.

            SO you can either have it take all space or have it keep the aspect ratio.

            Its not possible to have both in the cases where the numbers do not match up.

            KiraK Offline
            KiraK Offline
            Kira
            wrote on last edited by
            #5

            @mrjj : What do exactly mean for numbers do not match up?

            jsulmJ 1 Reply Last reply
            0
            • KiraK Kira

              @mrjj : What do exactly mean for numbers do not match up?

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @Kira said in Maintaining aspect ratio of qlabel:

              What do exactly mean for numbers do not match up?

              if height != width

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              1
              • J.HilkJ Offline
                J.HilkJ Offline
                J.Hilk
                Moderators
                wrote on last edited by
                #7

                you can override paintEvent and do it yourself:

                for example (assuming its a square image)

                void myLabel::paintEvent( QPaintEvent* event )
                {
                     int min = qMin(height(), width());
                     int xOff = (width() - min) / 2;
                     int yOff = (height() - min) / 2;
                
                    QPainter p(this);
                    p.drawImage(QRect(xOff,yOff,min,min), m_myImage);
                }
                

                Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                Q: What's that?
                A: It's blue light.
                Q: What does it do?
                A: It turns blue.

                KiraK 1 Reply Last reply
                1
                • J.HilkJ J.Hilk

                  you can override paintEvent and do it yourself:

                  for example (assuming its a square image)

                  void myLabel::paintEvent( QPaintEvent* event )
                  {
                       int min = qMin(height(), width());
                       int xOff = (width() - min) / 2;
                       int yOff = (height() - min) / 2;
                  
                      QPainter p(this);
                      p.drawImage(QRect(xOff,yOff,min,min), m_myImage);
                  }
                  
                  KiraK Offline
                  KiraK Offline
                  Kira
                  wrote on last edited by
                  #8

                  @J-Hilk : Thanks for the reply:
                  Current I am using the following:

                  void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                  {
                      QLabel::resizeEvent(pQEvent);
                      setPixmap(_qPixmap, pQEvent->size());
                  }
                  
                  void LabelAnnotation::setPixmap(const QPixmap &qPixmap, const QSize &size)
                  {
                      QPixmap _qPixmapScaled;
                      _qPixmap = qPixmap;
                      _qPixmapScaled = _qPixmap.scaled(size, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
                      QLabel::setPixmap(_qPixmapScaled);
                  }
                  

                  Will I have to remove the above function if i override paintEvent as mentioned ?

                  J.HilkJ 1 Reply Last reply
                  1
                  • KiraK Kira

                    @J-Hilk : Thanks for the reply:
                    Current I am using the following:

                    void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                    {
                        QLabel::resizeEvent(pQEvent);
                        setPixmap(_qPixmap, pQEvent->size());
                    }
                    
                    void LabelAnnotation::setPixmap(const QPixmap &qPixmap, const QSize &size)
                    {
                        QPixmap _qPixmapScaled;
                        _qPixmap = qPixmap;
                        _qPixmapScaled = _qPixmap.scaled(size, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
                        QLabel::setPixmap(_qPixmapScaled);
                    }
                    

                    Will I have to remove the above function if i override paintEvent as mentioned ?

                    J.HilkJ Offline
                    J.HilkJ Offline
                    J.Hilk
                    Moderators
                    wrote on last edited by J.Hilk
                    #9

                    @Kira I don't think so,

                    you can access your modified/scaled pixmap by calling pixmap() and QPainter has a drawPixmap method as well.


                    just noticed, that what I wrote, does not actually match what you want.

                    Do I understand it correctly, that you want a way to rescale your QLabel, so that it fits the Pixmap ?


                    Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                    Q: What's that?
                    A: It's blue light.
                    Q: What does it do?
                    A: It turns blue.

                    KiraK 1 Reply Last reply
                    1
                    • J.HilkJ J.Hilk

                      @Kira I don't think so,

                      you can access your modified/scaled pixmap by calling pixmap() and QPainter has a drawPixmap method as well.


                      just noticed, that what I wrote, does not actually match what you want.

                      Do I understand it correctly, that you want a way to rescale your QLabel, so that it fits the Pixmap ?

                      KiraK Offline
                      KiraK Offline
                      Kira
                      wrote on last edited by
                      #10

                      @J-Hilk : yes
                      I tried running your code its shrinks my pixmap a bit :p

                      J.HilkJ 1 Reply Last reply
                      0
                      • KiraK Offline
                        KiraK Offline
                        Kira
                        wrote on last edited by
                        #11

                        @jsulm : Just a strange thing the program crashes after some time without throwing any specific error

                        1 Reply Last reply
                        0
                        • KiraK Kira

                          @J-Hilk : yes
                          I tried running your code its shrinks my pixmap a bit :p

                          J.HilkJ Offline
                          J.HilkJ Offline
                          J.Hilk
                          Moderators
                          wrote on last edited by
                          #12

                          @Kira well, is your label part of a layout or do you resize it manually?

                          because you will have to resize it manually, having it in a layout will make things tricky


                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                          Q: What's that?
                          A: It's blue light.
                          Q: What does it do?
                          A: It turns blue.

                          KiraK 1 Reply Last reply
                          1
                          • J.HilkJ J.Hilk

                            @Kira well, is your label part of a layout or do you resize it manually?

                            because you will have to resize it manually, having it in a layout will make things tricky

                            KiraK Offline
                            KiraK Offline
                            Kira
                            wrote on last edited by
                            #13

                            @J-Hilk : My label is part of the Grid layout.
                            I have seen various articles related to the issue, but none of them provide an exact solution. Is there a specific way to handle such a scenario.

                            J.HilkJ 1 Reply Last reply
                            0
                            • KiraK Kira

                              @J-Hilk : My label is part of the Grid layout.
                              I have seen various articles related to the issue, but none of them provide an exact solution. Is there a specific way to handle such a scenario.

                              J.HilkJ Offline
                              J.HilkJ Offline
                              J.Hilk
                              Moderators
                              wrote on last edited by
                              #14

                              @Kira
                              Ok, I suggest the following, I used it before with moderate success rate.

                              set the SizePolcy of either width or height to fixed.

                              inside the overloaded resizeEvent, set the min width/height of your fixed side to the appropriate length (according to the pixmap ratio)

                              It should work, but be beware of potential recursive resizeEvents, as this is a clunky workaround.


                              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                              Q: What's that?
                              A: It's blue light.
                              Q: What does it do?
                              A: It turns blue.

                              KiraK 1 Reply Last reply
                              0
                              • J.HilkJ J.Hilk

                                @Kira
                                Ok, I suggest the following, I used it before with moderate success rate.

                                set the SizePolcy of either width or height to fixed.

                                inside the overloaded resizeEvent, set the min width/height of your fixed side to the appropriate length (according to the pixmap ratio)

                                It should work, but be beware of potential recursive resizeEvents, as this is a clunky workaround.

                                KiraK Offline
                                KiraK Offline
                                Kira
                                wrote on last edited by
                                #15

                                @J-Hilk :
                                OK, thanks, understood.
                                What does moderate success mean?
                                How can I determine the aspect ratio ?
                                I will figure the code but would be grateful if you have any working sample.

                                J.HilkJ 1 Reply Last reply
                                0
                                • KiraK Kira

                                  @J-Hilk :
                                  OK, thanks, understood.
                                  What does moderate success mean?
                                  How can I determine the aspect ratio ?
                                  I will figure the code but would be grateful if you have any working sample.

                                  J.HilkJ Offline
                                  J.HilkJ Offline
                                  J.Hilk
                                  Moderators
                                  wrote on last edited by
                                  #16

                                  @Kira

                                  What does moderate success mean

                                  when actively resizing the window, you may get "flickering" as the new min size may tricker a new recalculating of the other widgets inside the layout

                                  How can I determine the aspect ratio
                                  I will figure the code but would be grateful if you have any working sample

                                  untested:

                                  //Assuming horizontal size policy is fixed
                                  void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                                  {
                                      double minw = (static_cast<double>(_qPixmap.width()) * height()) / _qPixmap.height();
                                     setMinimumWidth(static_cast<int>(minw));
                                  }
                                  

                                  Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                  Q: What's that?
                                  A: It's blue light.
                                  Q: What does it do?
                                  A: It turns blue.

                                  KiraK 3 Replies Last reply
                                  2
                                  • J.HilkJ J.Hilk

                                    @Kira

                                    What does moderate success mean

                                    when actively resizing the window, you may get "flickering" as the new min size may tricker a new recalculating of the other widgets inside the layout

                                    How can I determine the aspect ratio
                                    I will figure the code but would be grateful if you have any working sample

                                    untested:

                                    //Assuming horizontal size policy is fixed
                                    void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                                    {
                                        double minw = (static_cast<double>(_qPixmap.width()) * height()) / _qPixmap.height();
                                       setMinimumWidth(static_cast<int>(minw));
                                    }
                                    
                                    KiraK Offline
                                    KiraK Offline
                                    Kira
                                    wrote on last edited by
                                    #17

                                    @J-Hilk :Thanks a lot will implement it and let you know.

                                    1 Reply Last reply
                                    0
                                    • J.HilkJ J.Hilk

                                      @Kira

                                      What does moderate success mean

                                      when actively resizing the window, you may get "flickering" as the new min size may tricker a new recalculating of the other widgets inside the layout

                                      How can I determine the aspect ratio
                                      I will figure the code but would be grateful if you have any working sample

                                      untested:

                                      //Assuming horizontal size policy is fixed
                                      void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                                      {
                                          double minw = (static_cast<double>(_qPixmap.width()) * height()) / _qPixmap.height();
                                         setMinimumWidth(static_cast<int>(minw));
                                      }
                                      
                                      KiraK Offline
                                      KiraK Offline
                                      Kira
                                      wrote on last edited by
                                      #18

                                      @J-Hilk : Here are we resizing the window or the QLabel.
                                      I implemented the following, but still, there is space left when I make the window to full screen.

                                      J.HilkJ 1 Reply Last reply
                                      0
                                      • KiraK Kira

                                        @J-Hilk : Here are we resizing the window or the QLabel.
                                        I implemented the following, but still, there is space left when I make the window to full screen.

                                        J.HilkJ Offline
                                        J.HilkJ Offline
                                        J.Hilk
                                        Moderators
                                        wrote on last edited by
                                        #19

                                        @Kira said in Maintaining aspect ratio of qlabel:

                                        I implemented the following

                                        I don't see it. May be lost in the depth of the forum ?


                                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                        Q: What's that?
                                        A: It's blue light.
                                        Q: What does it do?
                                        A: It turns blue.

                                        1 Reply Last reply
                                        0
                                        • J.HilkJ J.Hilk

                                          @Kira

                                          What does moderate success mean

                                          when actively resizing the window, you may get "flickering" as the new min size may tricker a new recalculating of the other widgets inside the layout

                                          How can I determine the aspect ratio
                                          I will figure the code but would be grateful if you have any working sample

                                          untested:

                                          //Assuming horizontal size policy is fixed
                                          void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                                          {
                                              double minw = (static_cast<double>(_qPixmap.width()) * height()) / _qPixmap.height();
                                             setMinimumWidth(static_cast<int>(minw));
                                          }
                                          
                                          KiraK Offline
                                          KiraK Offline
                                          Kira
                                          wrote on last edited by
                                          #20

                                          @J-Hilk said in Maintaining aspect ratio of qlabel:

                                          void LabelAnnotation::resizeEvent(QResizeEvent *pQEvent)
                                          {
                                          double minw = (static_cast<double>(_qPixmap.width()) * height()) / _qPixmap.height();
                                          setMinimumWidth(static_cast<int>(minw));
                                          }

                                          This one :)

                                          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