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.
  • 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