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

Qt emit signal after widget is closed

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 5 Posters 4.6k 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.
  • 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