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. Qt emit signal after widget is closed
Forum Updated to NodeBB v4.3 + New Features

Qt emit signal after widget is closed

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 5 Posters 4.1k 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.
  • P Offline
    P Offline
    pmanc
    wrote on last edited by pmanc
    #7

    In the destuctor of AdvancedDialog there's only

    delete ui;
    

    The error is:

    Exception triggered
    the inferior stopped because it triggered an exception.
    Stopped in thread 18 by: Exception at 0x7fff5b5fd49 code 0xc0000005
    read access violation at 0xffffffffffffff  flags=0x0 (first chance)
    

    The debugger is stuck at

    AdvancedDialog::errorTcpSignal
    

    Thanks!

    Edit: I think the problem is that errorTcpSignal is declared in the header of AdvancedDialog, so when AdvancedDialog is deleted the signal cannot be emitted.

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #8

      We need to see the backtrace.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      1
      • P Offline
        P Offline
        pmanc
        wrote on last edited by
        #9

        I hope this is good

        upload.PNG

        Thanks!

        jsulmJ 1 Reply Last reply
        0
        • P pmanc

          I hope this is good

          upload.PNG

          Thanks!

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

          @pmanc Looks like the signal is still emitted. Can you try to disconnect manually before calling deleteLater() to see whether it still crashes?

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

          P 1 Reply Last reply
          0
          • jsulmJ jsulm

            @pmanc Looks like the signal is still emitted. Can you try to disconnect manually before calling deleteLater() to see whether it still crashes?

            P Offline
            P Offline
            pmanc
            wrote on last edited by
            #11

            @jsulm I added

            disconnect(ad, nullptr, nullptr, nullptr);
            

            before deleteLater, but still crashes, plus at live 295 I have a semantic error:

            moc_advanceddialog.cpp:295:5: error: no matching function for call to 'activate'
            qobjectdefs.h:397:17: note: candidate function not viable: no known conversion from 'AdvancedDialog *' to 'QObject *' for 1st argument
            qobjectdefs.h:398:17: note: candidate function not viable: no known conversion from 'AdvancedDialog *' to 'QObject *' for 1st argument
            qobjectdefs.h:396:17: note: candidate function not viable: requires 3 arguments, but 4 were provided
            
            J.HilkJ 1 Reply Last reply
            0
            • P pmanc

              @jsulm I added

              disconnect(ad, nullptr, nullptr, nullptr);
              

              before deleteLater, but still crashes, plus at live 295 I have a semantic error:

              moc_advanceddialog.cpp:295:5: error: no matching function for call to 'activate'
              qobjectdefs.h:397:17: note: candidate function not viable: no known conversion from 'AdvancedDialog *' to 'QObject *' for 1st argument
              qobjectdefs.h:398:17: note: candidate function not viable: no known conversion from 'AdvancedDialog *' to 'QObject *' for 1st argument
              qobjectdefs.h:396:17: note: candidate function not viable: requires 3 arguments, but 4 were provided
              
              J.HilkJ Offline
              J.HilkJ Offline
              J.Hilk
              Moderators
              wrote on last edited by
              #12

              @pmanc QObject::Connect returns a QMetaObject::Connection you're supposed to store that and call disconnect on that object


              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.

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

                @pmanc QObject::Connect returns a QMetaObject::Connection you're supposed to store that and call disconnect on that object

                P Offline
                P Offline
                pmanc
                wrote on last edited by pmanc
                #13

                @J-Hilk
                Sorry, i didn't know.
                Now I have

                AdvancedDialog *ad = new AdvancedDialog(this);
                QMetaObject::Connection c = connect(ad, SIGNAL(errorTcpSignal(QString)), this, SLOT(displayTcpError(QString)));
                ad->exec();
                disconnect(c);
                ad->deleteLater();
                

                But still crashes, this SIGNAL is emitted.

                1 Reply Last reply
                0
                • B Offline
                  B Offline
                  Bonnie
                  wrote on last edited by Bonnie
                  #14

                  disconnect won't stop the signal emitting, just stop calling the slot.
                  I think you should disconnect the other connection, from that SocketError.
                  That connection doesn't have a receiver context, so the lambda will be called even after this is destroyed.
                  How about add this as the receiver context:

                  connect(&t, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), this, [=](QAbstractSocket::SocketError err){
                              emit errorTcpSignal(...);
                          });
                  
                  P 1 Reply Last reply
                  1
                  • B Bonnie

                    disconnect won't stop the signal emitting, just stop calling the slot.
                    I think you should disconnect the other connection, from that SocketError.
                    That connection doesn't have a receiver context, so the lambda will be called even after this is destroyed.
                    How about add this as the receiver context:

                    connect(&t, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), this, [=](QAbstractSocket::SocketError err){
                                emit errorTcpSignal(...);
                            });
                    
                    P Offline
                    P Offline
                    pmanc
                    wrote on last edited by
                    #15

                    @Bonnie
                    Thank you very much for your reply.
                    The problem is that I want the signal to be emitted when I close the QDialog too.
                    I have MainWindow with the slot for the error, and the QDialog that emits the signal.
                    The core of the problem is that I want to receive the signal from QDialog 's QtConcurrent thread also after QDialog has been closed.

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      Bonnie
                      wrote on last edited by Bonnie
                      #16

                      From your screen capture, the errorTcpSignal is a member from AdvancedDialog, right?
                      Where do you emit it then? I'm not quite understanding your code since I don't know what is this in those connections.
                      If you want the dialog to emit the signal, then you can't delete it.

                      P 1 Reply Last reply
                      0
                      • B Bonnie

                        From your screen capture, the errorTcpSignal is a member from AdvancedDialog, right?
                        Where do you emit it then? I'm not quite understanding your code since I don't know what is this in those connections.
                        If you want the dialog to emit the signal, then you can't delete it.

                        P Offline
                        P Offline
                        pmanc
                        wrote on last edited by
                        #17

                        @Bonnie
                        Yes, errorTcpSignal is a member from AdvancedDialog.
                        I emit it from a QtConcurrent thread in AdvancedDialog when an AdvancedDialog 's button is pressed.
                        If I don't delete it everything works, but I'll have a memory leak.

                        B 1 Reply Last reply
                        0
                        • P pmanc

                          @Bonnie
                          Yes, errorTcpSignal is a member from AdvancedDialog.
                          I emit it from a QtConcurrent thread in AdvancedDialog when an AdvancedDialog 's button is pressed.
                          If I don't delete it everything works, but I'll have a memory leak.

                          B Offline
                          B Offline
                          Bonnie
                          wrote on last edited by Bonnie
                          #18

                          @pmanc said in Qt emit signal after widget is closed:

                          If I don't delete it everything works, but I'll have a memory leak.

                          No, you won't.
                          It have a parent widget (in your code when you new it), so it will be deleted after the parent is destoyed.
                          But I still don't think it is a right design since you want to delete the dialog but also need it to send signals.
                          Though I don't fully understand your logic, I think you should handle the QtConcurrent related code in your QMainWindow.

                          P 1 Reply Last reply
                          0
                          • B Bonnie

                            @pmanc said in Qt emit signal after widget is closed:

                            If I don't delete it everything works, but I'll have a memory leak.

                            No, you won't.
                            It have a parent widget (in your code when you new it), so it will be deleted after the parent is destoyed.
                            But I still don't think it is a right design since you want to delete the dialog but also need it to send signals.
                            Though I don't fully understand your logic, I think you should handle the QtConcurrent related code in your QMainWindow.

                            P Offline
                            P Offline
                            pmanc
                            wrote on last edited by
                            #19

                            @Bonnie
                            I see. But every time I open a new AdvancedDialog I see my memory use to grow in the task manager.
                            Should I initialize AdvancedDialog once in the MainWindow constructor and show / hide it when I need?

                            By the way, great community, everyone!

                            jsulmJ B 2 Replies Last reply
                            0
                            • P pmanc

                              @Bonnie
                              I see. But every time I open a new AdvancedDialog I see my memory use to grow in the task manager.
                              Should I initialize AdvancedDialog once in the MainWindow constructor and show / hide it when I need?

                              By the way, great community, everyone!

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

                              @pmanc said in Qt emit signal after widget is closed:

                              But every time I open a new AdvancedDialog

                              If you need this dialog often then don't delete it and don't recreate it each time you need it. Create it once.

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

                              1 Reply Last reply
                              3
                              • P pmanc

                                @Bonnie
                                I see. But every time I open a new AdvancedDialog I see my memory use to grow in the task manager.
                                Should I initialize AdvancedDialog once in the MainWindow constructor and show / hide it when I need?

                                By the way, great community, everyone!

                                B Offline
                                B Offline
                                Bonnie
                                wrote on last edited by
                                #21

                                @pmanc said in Qt emit signal after widget is closed:

                                Should I initialize AdvancedDialog once in the MainWindow constructor and show / hide it when I need?

                                If you want to keep handling QtConcurrent related things in the dialog , I think you should.

                                P 1 Reply Last reply
                                3
                                • B Bonnie

                                  @pmanc said in Qt emit signal after widget is closed:

                                  Should I initialize AdvancedDialog once in the MainWindow constructor and show / hide it when I need?

                                  If you want to keep handling QtConcurrent related things in the dialog , I think you should.

                                  P Offline
                                  P Offline
                                  pmanc
                                  wrote on last edited by
                                  #22

                                  Ok thank you very much for your time!

                                  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