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 detect when QWidget’s layout is fully updated and geometry is ready after dynamic content changes?

How to detect when QWidget’s layout is fully updated and geometry is ready after dynamic content changes?

Scheduled Pinned Locked Moved Solved General and Desktop
6 Posts 4 Posters 296 Views
  • 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.
  • K Offline
    K Offline
    Kevin Hoang
    wrote on last edited by
    #1

    Hi everyone,

    I'm working on a dynamic UI component where I dynamically add child widgets (e.g., QLabel) into a QBoxLayout (such as QVBoxLayout).

    Here is my situation:

    • Initially, the main QWidget has size (0, 0) because there’s no content yet.
    • When I add an item (like a QLabel) to the layout, I expect the widget's size to automatically adjust to fit the content.
    • However, immediately after adding the item, the parent widget's geometry and size are still (0, 0), and sizeHint() is (0, 0).
    • The geometry (and correct size) updates only later, but there's no clear event to detect exactly when the layout is finished updating.

    My need:

    • I need to know exactly when the widget has updated its layout and geometry properly so I can calculate a proper display position.
    • I also need the geometry ready before starting any QPropertyAnimation on the widget.
    • Currently, if I trigger animation or positioning immediately after adding the item, the widget hasn’t resized yet, and it causes incorrect results.

    What I’ve tried:

    • adjustSize()
    • layout()->invalidate()
    • QTimer::singleShot(0, ...)
    • ...

    None of these methods consistently work: the widget’s size is still not reliable right after these calls.

    My Question:
    👉 How can I reliably detect when a QWidget's layout has fully recalculated, the size and geometry are correct, and the widget is ready for positioning and animation?

    Any advice, tips, or workaround would be greatly appreciated!

    JonBJ JoeCFDJ 2 Replies Last reply
    0
    • K Kevin Hoang

      Hi everyone,

      I'm working on a dynamic UI component where I dynamically add child widgets (e.g., QLabel) into a QBoxLayout (such as QVBoxLayout).

      Here is my situation:

      • Initially, the main QWidget has size (0, 0) because there’s no content yet.
      • When I add an item (like a QLabel) to the layout, I expect the widget's size to automatically adjust to fit the content.
      • However, immediately after adding the item, the parent widget's geometry and size are still (0, 0), and sizeHint() is (0, 0).
      • The geometry (and correct size) updates only later, but there's no clear event to detect exactly when the layout is finished updating.

      My need:

      • I need to know exactly when the widget has updated its layout and geometry properly so I can calculate a proper display position.
      • I also need the geometry ready before starting any QPropertyAnimation on the widget.
      • Currently, if I trigger animation or positioning immediately after adding the item, the widget hasn’t resized yet, and it causes incorrect results.

      What I’ve tried:

      • adjustSize()
      • layout()->invalidate()
      • QTimer::singleShot(0, ...)
      • ...

      None of these methods consistently work: the widget’s size is still not reliable right after these calls.

      My Question:
      👉 How can I reliably detect when a QWidget's layout has fully recalculated, the size and geometry are correct, and the widget is ready for positioning and animation?

      Any advice, tips, or workaround would be greatly appreciated!

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

      @Kevin-Hoang
      I don't know the answer to your complicated situation. But I think you might read through

      • https://stackoverflow.com/questions/17307867/qt-when-is-layout-final
      • https://stackoverflow.com/questions/78795785/is-there-a-qt-event-for-when-a-qlayout-has-finished-redoing-geometry

      Also, you said QTimer::singleShot(0, ...) did not work. What about QTimer::singleShot(1000, ...), if that does not work don't you have a problem? I am not suggesting this for long term, but as a sanity check.

      Btw, I'm not sure it's what you want but every widget has a void QWidget::showEvent(QShowEvent *event), you can use that if you have sibclassed, check that for correct size if you want that?

      1 Reply Last reply
      0
      • K Kevin Hoang

        Hi everyone,

        I'm working on a dynamic UI component where I dynamically add child widgets (e.g., QLabel) into a QBoxLayout (such as QVBoxLayout).

        Here is my situation:

        • Initially, the main QWidget has size (0, 0) because there’s no content yet.
        • When I add an item (like a QLabel) to the layout, I expect the widget's size to automatically adjust to fit the content.
        • However, immediately after adding the item, the parent widget's geometry and size are still (0, 0), and sizeHint() is (0, 0).
        • The geometry (and correct size) updates only later, but there's no clear event to detect exactly when the layout is finished updating.

        My need:

        • I need to know exactly when the widget has updated its layout and geometry properly so I can calculate a proper display position.
        • I also need the geometry ready before starting any QPropertyAnimation on the widget.
        • Currently, if I trigger animation or positioning immediately after adding the item, the widget hasn’t resized yet, and it causes incorrect results.

        What I’ve tried:

        • adjustSize()
        • layout()->invalidate()
        • QTimer::singleShot(0, ...)
        • ...

        None of these methods consistently work: the widget’s size is still not reliable right after these calls.

        My Question:
        👉 How can I reliably detect when a QWidget's layout has fully recalculated, the size and geometry are correct, and the widget is ready for positioning and animation?

        Any advice, tips, or workaround would be greatly appreciated!

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

        @Kevin-Hoang
        if the main widget changes size, resize event may be the better choice. Override the following event in your main widget class.
        void resizeEvent(QResizeEvent *event) override;

        1 Reply Last reply
        1
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Hi,

          This will possible once the widget is shown before that it does not have any "physical" presence.
          As @JoeCFD wrote, resizeEvent is called when widgets have changed size.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • K Offline
            K Offline
            Kevin Hoang
            wrote on last edited by
            #5

            Thank you all for your support!
            Using the resize event works well for my case. It allows me to get the correct geometry as I expected.
            There is still a minor issue, but it’s not a big concern for my application.
            Thanks again for your helpful suggestions!

            1 Reply Last reply
            1
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              You're welcome !
              Since you have it working now, please mark the thread as solved using the "Topic Tools" button or the three dotted menu beside the answer you deem correct so other forum users may know a solution has been found :-)

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • K Kevin Hoang has marked this topic as solved on

              • Login

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