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. QMdiSubWindow geometry and size save and restore
QtWS25 Last Chance

QMdiSubWindow geometry and size save and restore

Scheduled Pinned Locked Moved Solved General and Desktop
qmdiareaqmdisubwindow
13 Posts 2 Posters 1.4k 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.
  • artwawA Offline
    artwawA Offline
    artwaw
    wrote on last edited by
    #1

    Good morning,
    today I struggle with saving and restoring those sub windows. I'd find it useful to save size and geometry of those.

    The case: I have literally three sub windows at most, each is QMdiSubWindow with a custom (each time different) descendant of QWidget set as a widget. I add them simply by invoking QMdiArea->addSubWindow().

    Since I could not find a signal in QMdiArea nor in QMdiSubWindow that would notify me if the sub window is about to close... I could write a class based on QMdiSubWindow and override onClose() but would that require me to overwrite QMdiArea as well or simple object cast when addSubWindow() is used will suffice?

    Or is there any other way to catch the moment of closing?

    I am using Qt 5.15.2

    Many thanks in advance.

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

      Hi
      What about an event filter?

      https://stackoverflow.com/questions/8818297/qt-how-to-know-when-a-qmdisubwindow-is-closed

      not that subclassing QMdiSubWindow is a bad idea and im sure you can use it
      with minimal casting to use with the std. QMdiArea

      artwawA 1 Reply Last reply
      2
      • mrjjM mrjj

        Hi
        What about an event filter?

        https://stackoverflow.com/questions/8818297/qt-how-to-know-when-a-qmdisubwindow-is-closed

        not that subclassing QMdiSubWindow is a bad idea and im sure you can use it
        with minimal casting to use with the std. QMdiArea

        artwawA Offline
        artwawA Offline
        artwaw
        wrote on last edited by
        #3

        @mrjj Thank you for clarifying. Will test both. I never used event filters before, seems like a learning opportunity.

        mrjjM 1 Reply Last reply
        1
        • artwawA artwaw

          @mrjj Thank you for clarifying. Will test both. I never used event filters before, seems like a learning opportunity.

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

          @artwaw
          well event filters are handy for catching events from outside in cases where subclassing might be a bit invasive to existing code or subclassing would be a bit massive if many types of widgets are involved.

          That said, one has to take care not to eat events by accident.

          https://doc.qt.io/qt-5/eventsandfilters.html

          artwawA 1 Reply Last reply
          1
          • mrjjM mrjj

            @artwaw
            well event filters are handy for catching events from outside in cases where subclassing might be a bit invasive to existing code or subclassing would be a bit massive if many types of widgets are involved.

            That said, one has to take care not to eat events by accident.

            https://doc.qt.io/qt-5/eventsandfilters.html

            artwawA Offline
            artwawA Offline
            artwaw
            wrote on last edited by
            #5

            @mrjj Event filter works nicely when mdi sub window is closed and restored but there is one edge case:
            when closing application with sub window open it is not called at all. Any hint you can offer how to get past that?

            mrjjM 1 Reply Last reply
            0
            • artwawA artwaw

              @mrjj Event filter works nicely when mdi sub window is closed and restored but there is one edge case:
              when closing application with sub window open it is not called at all. Any hint you can offer how to get past that?

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

              @artwaw
              Hi
              Well i guess any open windows are just deleted, not closed as such, when whole app exits.

              One way could be to override closeEvent for the mainwindow and
              loop over the windows (ui->mdiArea->subWindowList ) , calling close() on each
              to have the event code handle it like they were manually closed.

              artwawA 2 Replies Last reply
              1
              • mrjjM mrjj

                @artwaw
                Hi
                Well i guess any open windows are just deleted, not closed as such, when whole app exits.

                One way could be to override closeEvent for the mainwindow and
                loop over the windows (ui->mdiArea->subWindowList ) , calling close() on each
                to have the event code handle it like they were manually closed.

                artwawA Offline
                artwawA Offline
                artwaw
                wrote on last edited by
                #7

                @mrjj Yes. Why didn't I thought of that? Thank you, you're a star!

                1 Reply Last reply
                1
                • mrjjM mrjj

                  @artwaw
                  Hi
                  Well i guess any open windows are just deleted, not closed as such, when whole app exits.

                  One way could be to override closeEvent for the mainwindow and
                  loop over the windows (ui->mdiArea->subWindowList ) , calling close() on each
                  to have the event code handle it like they were manually closed.

                  artwawA Offline
                  artwawA Offline
                  artwaw
                  wrote on last edited by
                  #8

                  @mrjj but calling close() on each of opened sub windows doesn't call the eventFilter on any of them.

                  mrjjM 1 Reply Last reply
                  1
                  • artwawA artwaw

                    @mrjj but calling close() on each of opened sub windows doesn't call the eventFilter on any of them.

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

                    @artwaw
                    Hi
                    Ah yes. my bad. sorry. the close() function is a direct method.
                    So move the inner saving code to a function that takes a QMdiSubWindow *
                    and call that from closeEvent pr Window.

                    You could also use
                    QCoreApplication::postEvent
                    to send a close to them.

                    artwawA 1 Reply Last reply
                    0
                    • mrjjM mrjj

                      @artwaw
                      Hi
                      Ah yes. my bad. sorry. the close() function is a direct method.
                      So move the inner saving code to a function that takes a QMdiSubWindow *
                      and call that from closeEvent pr Window.

                      You could also use
                      QCoreApplication::postEvent
                      to send a close to them.

                      artwawA Offline
                      artwawA Offline
                      artwaw
                      wrote on last edited by
                      #10

                      @mrjj it's interesting how it doesn't work.
                      I tried both postEvent and sendEvent, the former with normal and high priority - to no avail.

                      What's even more interesting for me here is that when mdi sub window is getting closed independently the internal widget's closeEvent() is being processed. When I just close the application with sub windows opened their closeEvent()s are not called at all - so implementing custom class based on QMdiSubWindow and overriding its closeEvent() makes no sense too.

                      I am truly puzzled now.

                      artwawA 2 Replies Last reply
                      0
                      • artwawA artwaw

                        @mrjj it's interesting how it doesn't work.
                        I tried both postEvent and sendEvent, the former with normal and high priority - to no avail.

                        What's even more interesting for me here is that when mdi sub window is getting closed independently the internal widget's closeEvent() is being processed. When I just close the application with sub windows opened their closeEvent()s are not called at all - so implementing custom class based on QMdiSubWindow and overriding its closeEvent() makes no sense too.

                        I am truly puzzled now.

                        artwawA Offline
                        artwawA Offline
                        artwaw
                        wrote on last edited by
                        #11
                        This post is deleted!
                        1 Reply Last reply
                        0
                        • artwawA artwaw

                          @mrjj it's interesting how it doesn't work.
                          I tried both postEvent and sendEvent, the former with normal and high priority - to no avail.

                          What's even more interesting for me here is that when mdi sub window is getting closed independently the internal widget's closeEvent() is being processed. When I just close the application with sub windows opened their closeEvent()s are not called at all - so implementing custom class based on QMdiSubWindow and overriding its closeEvent() makes no sense too.

                          I am truly puzzled now.

                          artwawA Offline
                          artwawA Offline
                          artwaw
                          wrote on last edited by
                          #12

                          All sorted. I made mistakes somewhere else and as a result closeEvent() of QMainWindow has not been called - once I fixed that everything works as per proposed solution with QCoreApplication::postEvent()

                          mrjjM 1 Reply Last reply
                          1
                          • artwawA artwaw

                            All sorted. I made mistakes somewhere else and as a result closeEvent() of QMainWindow has not been called - once I fixed that everything works as per proposed solution with QCoreApplication::postEvent()

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

                            @artwaw
                            Hi
                            excellent :)

                            Just as a note. If you get very into Docks then please notice
                            https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System

                            as It can dock to central/center, a feature which often is much loved when you want such setup.

                            1 Reply Last reply
                            1

                            • Login

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