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