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

    @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