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. Example of calling a function to parent?
Forum Updated to NodeBB v4.3 + New Features

Example of calling a function to parent?

Scheduled Pinned Locked Moved Unsolved General and Desktop
38 Posts 5 Posters 5.0k Views 2 Watching
  • 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 Panoss

    @JonB said in Example of calling a function to parent?:

    @Panoss said in Example of calling a function to parent?:

    When I close the form the instance is destroyed, right?

    No, that depends on what you mean/do by "close". And we don't see that in your shown code?

    It works but the message is printed twice, like if function ArticlesWindow::positionChanged is called twice??

    Does the "twice" happen from the very first time you create the form or after a second open?

    From the very first.

    @JonB said in Example of calling a function to parent?:
    Are the number calls equal to the number of times you create the form? If it stays at "twice" always, that alters what i would look for in the code.

    You mean number of calls to the function?
    I only call it once. Now, why it acts like if I call it twice, I have no idea!!

    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by JonB
    #29

    @Panoss
    Your ArticlesWindow::openPositionsForm() goes class positionsForm *form = new class positionsForm(model, this);. I want to know how many times you call openPositionsForm(), I believe you create each time you do something like click on something. I want to know whether the number of times you call openPositionsForm() (number of times you click to open it??) is or is not equal to the number of times you report

    updateParent called!!
    ArticlesWindow::positionChanged positionsForm(0x5de4a24160, name = "positionsForm")
    

    gets output. If you open & close the "positions form" 10 times do you get 10 "updateParent called!!" output?

    Meanwhile, where you have emit valueChanged(value); let's have a

    qDebug() << "emit valueChanged(value);"  << value;
    
    P 2 Replies Last reply
    0
    • JonBJ JonB

      @Panoss
      Your ArticlesWindow::openPositionsForm() goes class positionsForm *form = new class positionsForm(model, this);. I want to know how many times you call openPositionsForm(), I believe you create each time you do something like click on something. I want to know whether the number of times you call openPositionsForm() (number of times you click to open it??) is or is not equal to the number of times you report

      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0x5de4a24160, name = "positionsForm")
      

      gets output. If you open & close the "positions form" 10 times do you get 10 "updateParent called!!" output?

      Meanwhile, where you have emit valueChanged(value); let's have a

      qDebug() << "emit valueChanged(value);"  << value;
      
      P Offline
      P Offline
      Panoss
      wrote on last edited by Panoss
      #30

      @JonB

      1st opening of the positionsForm. Edited data and updated:
      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0xc2423e7660, name = "positionsForm")
      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0xc2423e7660, name = "positionsForm")
      
      2nd  opening of the positionsForm. Edited data and updated:
      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0xc2423e3980, name = "positionsForm")
      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0xc2423e3980, name = "positionsForm")
      
      3rd  opening of the positionsForm. Edited data and updated:
      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0xc2423e86a0, name = "positionsForm")
      updateParent called!!
      ArticlesWindow::positionChanged positionsForm(0xc2423e86a0, name = "positionsForm")
      

      So no matter how many times I open (and close) the positionsForm (which, as you correctly supposed, is created each time I click on a button), the function (positionChanged) gets called twice.
      I 'll have to look more thoroughly in the code, something stupid I must have done somewhere.

      1 Reply Last reply
      1
      • JonBJ JonB

        @Panoss
        Your ArticlesWindow::openPositionsForm() goes class positionsForm *form = new class positionsForm(model, this);. I want to know how many times you call openPositionsForm(), I believe you create each time you do something like click on something. I want to know whether the number of times you call openPositionsForm() (number of times you click to open it??) is or is not equal to the number of times you report

        updateParent called!!
        ArticlesWindow::positionChanged positionsForm(0x5de4a24160, name = "positionsForm")
        

        gets output. If you open & close the "positions form" 10 times do you get 10 "updateParent called!!" output?

        Meanwhile, where you have emit valueChanged(value); let's have a

        qDebug() << "emit valueChanged(value);"  << value;
        
        P Offline
        P Offline
        Panoss
        wrote on last edited by
        #31

        @JonB said in Example of calling a function to parent?:

        @Panoss
        Meanwhile, where you have emit valueChanged(value); let's have a

        qDebug() << "emit valueChanged(value);"  << value;
        
        updateParent called!!
        ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
        emit valueChanged(value); 1
        updateParent called!!
        ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
        emit valueChanged(value); 1
        

        The signal is emited twice???

        JonBJ M 2 Replies Last reply
        0
        • P Panoss

          @JonB said in Example of calling a function to parent?:

          @Panoss
          Meanwhile, where you have emit valueChanged(value); let's have a

          qDebug() << "emit valueChanged(value);"  << value;
          
          updateParent called!!
          ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
          emit valueChanged(value); 1
          updateParent called!!
          ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
          emit valueChanged(value); 1
          

          The signal is emited twice???

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #32

          @Panoss
          OK to the it-only-ever-gets-called-twice. (You may still have a leak on non-destruction, we'll leave that for now.)

          So... just how many times does your code call positionsForm::setValue(int value)?? Could that be twice, somewhere?

          1 Reply Last reply
          0
          • P Panoss

            @JonB said in Example of calling a function to parent?:

            @Panoss
            Meanwhile, where you have emit valueChanged(value); let's have a

            qDebug() << "emit valueChanged(value);"  << value;
            
            updateParent called!!
            ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
            emit valueChanged(value); 1
            updateParent called!!
            ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
            emit valueChanged(value); 1
            

            The signal is emited twice???

            M Offline
            M Offline
            mpergand
            wrote on last edited by
            #33

            @Panoss said in Example of calling a function to parent?:

            @JonB said in Example of calling a function to parent?:

            @Panoss
            Meanwhile, where you have emit valueChanged(value); let's have a

            qDebug() << "emit valueChanged(value);"  << value;
            
            updateParent called!!
            ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
            emit valueChanged(value); 1
            updateParent called!!
            ArticlesWindow::positionChanged positionsForm(0xba0e7004e0, name = "positionsForm")
            emit valueChanged(value); 1
            

            The signal is emited twice???

            Put a break point and look at the stack trace upon each call.

            As @JonB said, nothing is delete until you set it with:
            setAttribute(Qt::WA_DeleteOnClose);

            1 Reply Last reply
            2
            • P Offline
              P Offline
              Panoss
              wrote on last edited by Panoss
              #34

              Whereever in my code I open a form, this:

              form.setAttribute(Qt::WA_DeleteOnClose);
              

              is always included.

              I dubugged it but didn't find anything.
              Anyway, as it's not causing any issues I 'll leave as is.
              Better update twice than none! ):

              jsulmJ 1 Reply Last reply
              0
              • P Panoss

                Whereever in my code I open a form, this:

                form.setAttribute(Qt::WA_DeleteOnClose);
                

                is always included.

                I dubugged it but didn't find anything.
                Anyway, as it's not causing any issues I 'll leave as is.
                Better update twice than none! ):

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

                @Panoss You could add

                qDebug() << sender();
                

                to your slot - it will print the pointer to the emitter/sender of the signal. Then you will see whether the sender is always the same or different.

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

                1 Reply Last reply
                1
                • P Offline
                  P Offline
                  Panoss
                  wrote on last edited by Panoss
                  #36

                  @jsulm I did it, the sender is always the same.

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    Panoss
                    wrote on last edited by Panoss
                    #37

                    I have modified the Signal - Slot mechanism so that makes more sense:
                    Receiver:

                    articleswindow.cpp
                    void ArticlesWindow::positionChanged(){
                        qDebug() << "ArticlesWindow::positionChanged";
                    }
                    void ArticlesWindow::openPositionsForm(){    
                        class positionsForm *form = new class positionsForm(model, this);
                        connect(form, &positionsForm::valueChanged, this , &ArticlesWindow::positionChanged);
                    
                    

                    Sender:

                    positionsform.h
                      public slots:
                        void emitSignal();
                      signals:
                        void valueChanged(int newValue);
                    
                    positionsform.cpp
                    positionsForm::positionsForm(QSqlRelationalTableModel *parentmodel, QWidget *parent) : QDialog(parent), ui(new Ui::positionsForm){
                        connect(ui->positionsTable->model(),
                                SIGNAL(dataChanged(QModelIndex,QModelIndex)), this,
                                SLOT(emitSignal()));
                    }
                    void positionsForm::emitSignal(){    
                        emit valueChanged(1);
                    }
                    
                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mpergand
                      wrote on last edited by mpergand
                      #38

                      This code looks strange ...

                      class positionsForm *form = new class positionsForm(model, this);

                      The class name doesn't start with a capital letter and looking like a function, confusing.
                      Why are you using class , obviously positionsForm is a class.

                      and finally:

                      connect(ui->positionsTable->model(),
                                  SIGNAL(dataChanged(QModelIndex,QModelIndex)), this,
                                  SLOT(emitSignal()));
                      

                      since model is defined in ArticlesWindow why not make the connection straight away in that class ?

                      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