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. Irregular access violation when switching active subwindow in an MDI application
QtWS25 Last Chance

Irregular access violation when switching active subwindow in an MDI application

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 4 Posters 1.0k 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.
  • O Offline
    O Offline
    olowo726
    wrote on last edited by
    #1

    Hi,

    I'm getting an access violation when switching active subwindow in an MDI application. There is no simple repeatable procedure which triggers the access violation every time the a specific user pattern is followed but it's possible to get the access violation without much effort if one is adding and closing subwindows a few times and then invokes any of the MDI application window actions (Tile, Cascade, Next, Previous).

    Comparing my application to the MDI example application the only difference I find is that my application invokes setAttribute(Qt::WA_DeleteOnClose); on the MDI child windows.

    I would guess that's it's related to that the MDI area for some reason doesn't know that some subwindows has been removed, invoking methods in those now deleted subwindows. Can it be that QMdiArea::removeSubWindow should be invoked at some stage when WA_DeleteOnClose is used? But the MDI children at least isn't showed in the MDI area once they've been closed hence the MDI area at least in some aspects knows that the child window has been removed.

    Screenshot of Qt Creator debugger when the issue occurs

    Using Qt 5.15.1

    Anyone with ideas on how to track this down?

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

      Hi,

      Are you using addSubWindow as shown in the documentation ?

      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
      • O Offline
        O Offline
        olowo726
        wrote on last edited by
        #3

        I think so. The code is as follows with some company internal names changed to X. XMdiSubWindow inherits QMdiSubWindow to add some options to the system menu, that's all. XMdiSubWindow declares Q_OBJECT. XTable inherits QWidget and have subWindows as parent.

        XMdiSubWindow *subWindow = new XMdiSubWindow(this);
        subWindow->setAttribute(Qt::WA_DeleteOnClose);
        XTable *child = new XTable(subWindow, characteristicCoordinator_);
        subWindow->setWidget(child);
        addSubWindow(subWindow);
        
        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Are you giving a parent to XTable ?

          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
          • O Offline
            O Offline
            olowo726
            wrote on last edited by
            #5

            yes, subWindow is the parent.

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

              What happens if you don't ?

              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
              • O Offline
                O Offline
                olowo726
                wrote on last edited by
                #7

                Same thing, no difference

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

                  Do you get the same issue if you create a default application and use the code from the documentation as is ?

                  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
                  • O Offline
                    O Offline
                    olowo726
                    wrote on last edited by
                    #9

                    I modified the mdi example to read

                    MdiChild *MainWindow::createMdiChild()
                    {
                        MdiChild *child = new MdiChild;
                        QMdiSubWindow *subWindow1 = new QMdiSubWindow;
                        subWindow1->setWidget(child);
                        subWindow1->setAttribute(Qt::WA_DeleteOnClose);
                        mdiArea->addSubWindow(subWindow1);
                    
                    #ifndef QT_NO_CLIPBOARD
                        connect(child, &QTextEdit::copyAvailable, cutAct, &QAction::setEnabled);
                        connect(child, &QTextEdit::copyAvailable, copyAct, &QAction::setEnabled);
                    #endif
                    
                        return child;
                    }
                    

                    i.e. to be according to the documentation. That seems to work fine.

                    JonBJ 1 Reply Last reply
                    0
                    • O olowo726

                      I modified the mdi example to read

                      MdiChild *MainWindow::createMdiChild()
                      {
                          MdiChild *child = new MdiChild;
                          QMdiSubWindow *subWindow1 = new QMdiSubWindow;
                          subWindow1->setWidget(child);
                          subWindow1->setAttribute(Qt::WA_DeleteOnClose);
                          mdiArea->addSubWindow(subWindow1);
                      
                      #ifndef QT_NO_CLIPBOARD
                          connect(child, &QTextEdit::copyAvailable, cutAct, &QAction::setEnabled);
                          connect(child, &QTextEdit::copyAvailable, copyAct, &QAction::setEnabled);
                      #endif
                      
                          return child;
                      }
                      

                      i.e. to be according to the documentation. That seems to work fine.

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

                      @olowo726
                      The difference appears to be that you subWindow1->setAttribute(Qt::WA_DeleteOnClose); after subWindow1->setWidget(child);, in your earlier one you set it before setting the child widget, does that really alter the behaviour?

                      1 Reply Last reply
                      0
                      • O Offline
                        O Offline
                        olowo726
                        wrote on last edited by
                        #11

                        No difference (just tested)

                        JonBJ 1 Reply Last reply
                        0
                        • O olowo726

                          No difference (just tested)

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

                          @olowo726
                          :) As I thought! In which case, only me, but I'd want to know what is different about their example code compared to your original attempt? Maybe if you retry your original attempt it will work now?! Anyway, up to you, you can just stick with what you do have working now.

                          1 Reply Last reply
                          0
                          • O Offline
                            O Offline
                            olowo726
                            wrote on last edited by
                            #13

                            Sorry, I formulated myself badly, regarless of the order of the statement the application crashes.

                            1 Reply Last reply
                            0
                            • O Offline
                              O Offline
                              olowo726
                              wrote on last edited by
                              #14

                              I've solved this now but actually I don't know exactly why.

                              My application have several MDI areas which the user can switch between. I had forgotten to disconnect the tile etc. menu choices from the old MDI are when the user switched MDI area. When I corrected that the crash disappeared as well indicating that the old signal connections somehow loomed. However I don't know why, I think that the signals should have been automatically disconnected when the objects were destroyed.

                              mrjjM 1 Reply Last reply
                              0
                              • O olowo726

                                I've solved this now but actually I don't know exactly why.

                                My application have several MDI areas which the user can switch between. I had forgotten to disconnect the tile etc. menu choices from the old MDI are when the user switched MDI area. When I corrected that the crash disappeared as well indicating that the old signal connections somehow loomed. However I don't know why, I think that the signals should have been automatically disconnected when the objects were destroyed.

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

                                @olowo726

                                Hi
                                Did you verify the objects were actually destroyed?
                                Else that would explain why they are still connected.

                                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