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
    #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