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

    Thank you very much, you are right.
    The only problem is that :

    AdvancedDialog ad = new AdvancedDialog(this);
    connect(ad, SIGNAL(errorTcpSignal(QString)), this, SLOT(displayTcpError(QString)));
    ad->exec();
    ad->deleteLater();
    

    The deleteLater will make the program crash, if not included I'll have a memory leak.
    Anyway, I declared

    AdvancedDialog  ad
    

    in the header and in the QMainWindow constructor

    connect(&ad, SIGNAL(errorTcpSignal(QString)), this, SLOT(displayTcpError(QString)));
    

    This works, but is there a better way to do it?
    Cheers.

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #6

    @pmanc said in Qt emit signal after widget is closed:

    The deleteLater will make the program crash

    Did you analyse the crash? What happens? What are you doing in the destructor?

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • P Offline
      P Offline
      pmanc
      wrote on last edited by pmanc
      #7

      In the destuctor of AdvancedDialog there's only

      delete ui;
      

      The error is:

      Exception triggered
      the inferior stopped because it triggered an exception.
      Stopped in thread 18 by: Exception at 0x7fff5b5fd49 code 0xc0000005
      read access violation at 0xffffffffffffff  flags=0x0 (first chance)
      

      The debugger is stuck at

      AdvancedDialog::errorTcpSignal
      

      Thanks!

      Edit: I think the problem is that errorTcpSignal is declared in the header of AdvancedDialog, so when AdvancedDialog is deleted the signal cannot be emitted.

      1 Reply Last reply
      0
      • 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