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. Confusion between the usage of 'this' and 'parent'
QtWS25 Last Chance

Confusion between the usage of 'this' and 'parent'

Scheduled Pinned Locked Moved Solved General and Desktop
55 Posts 9 Posters 7.8k 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 JKSH
    8 Dec 2021, 06:17

    @Swati777999 said in Confusion between the usage of 'this' and 'parent':

    Answer to above fill in the blanks: parent, parent (which is set to null pointer)

    OK, and what happens when you set nullptr as a widget's parent? (Hint: Your LayoutExample object also has nullptr as its parent)

    button1=new QPushButton("Click Here",this);

    Good, now you have set your LayoutExample object as the QPushButton's parent. Previously, it had no parent.

    However, the layout part seems to have not worked for these widgets.

    When you use QGridLayout, you should also specify the row and column: https://doc.qt.io/qt-5/qgridlayout.html#addWidget-1

    I observed that if I comment line this->show() , quit pushbutton from main.cpp seems to be overlapping signup pushbutton as they're in the same location.

    That is because the QPushButton from main.cpp was not put in a layout. It is good practice to put all child widgets in a layout.

    S Offline
    S Offline
    Swati777999
    wrote on 8 Dec 2021, 06:26 last edited by
    #32

    @JKSH said in Confusion between the usage of 'this' and 'parent':

    @Swati777999 said in Confusion between the usage of 'this' and 'parent':

    Answer to above fill in the blanks: parent, parent (which is set to null pointer)

    OK, and what happens when you set nullptr as a widget's parent? (Hint: Your LayoutExample object also has nullptr as its parent)

    When the widget's parent is set to null, that means it has no parent, maybe it starts acting as a parent.

    “ In order to be irreplaceable, one must always be different” – Coco Chanel

    J 1 Reply Last reply 8 Dec 2021, 06:51
    0
    • S Swati777999
      8 Dec 2021, 06:26

      @JKSH said in Confusion between the usage of 'this' and 'parent':

      @Swati777999 said in Confusion between the usage of 'this' and 'parent':

      Answer to above fill in the blanks: parent, parent (which is set to null pointer)

      OK, and what happens when you set nullptr as a widget's parent? (Hint: Your LayoutExample object also has nullptr as its parent)

      When the widget's parent is set to null, that means it has no parent, maybe it starts acting as a parent.

      J Offline
      J Offline
      JKSH
      Moderators
      wrote on 8 Dec 2021, 06:51 last edited by
      #33

      @Swati777999 said in Confusion between the usage of 'this' and 'parent':

      OK, and what happens when you set nullptr as a widget's parent? (Hint: Your LayoutExample object also has nullptr as its parent)

      When the widget's parent is set to null, that means it has no parent,

      Correct.

      maybe it starts acting as a parent.

      That's not quite right. When a widget has no parent, it can act as a top-level window (say "top-level window", not "parent"). That means whenever you call show() on a widget that has no parent, then that widget appears in a new window.

      // button1 and button2 have a parent, and will appear inside your widget
      button1 = new QPushButton("Click Here", this);
      button2 = new QPushButton("Sign up",this);
      
      // button3 has no parent, and will open in a new window
      button3 = new QPushButton("Hello");
      button3->show(); // If you don't call show(), button3 will be invisible
      

      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

      S 1 Reply Last reply 8 Dec 2021, 07:33
      4
      • J JKSH
        8 Dec 2021, 06:51

        @Swati777999 said in Confusion between the usage of 'this' and 'parent':

        OK, and what happens when you set nullptr as a widget's parent? (Hint: Your LayoutExample object also has nullptr as its parent)

        When the widget's parent is set to null, that means it has no parent,

        Correct.

        maybe it starts acting as a parent.

        That's not quite right. When a widget has no parent, it can act as a top-level window (say "top-level window", not "parent"). That means whenever you call show() on a widget that has no parent, then that widget appears in a new window.

        // button1 and button2 have a parent, and will appear inside your widget
        button1 = new QPushButton("Click Here", this);
        button2 = new QPushButton("Sign up",this);
        
        // button3 has no parent, and will open in a new window
        button3 = new QPushButton("Hello");
        button3->show(); // If you don't call show(), button3 will be invisible
        
        S Offline
        S Offline
        Swati777999
        wrote on 8 Dec 2021, 07:33 last edited by Swati777999 12 Aug 2021, 07:33
        #34

        @JKSH said in Confusion between the usage of 'this' and 'parent':

        @Swati777999 said in Confusion between the usage of 'this' and 'parent':

        button1 and button2 appear on the window because I have used this->show() at the end.

        // button1 and button2 have a parent, and will appear inside your widget
        button1 = new QPushButton("Click Here", this);
        button2 = new QPushButton("Sign up",this);
        
        // button3 has no parent, and will open in a new window
        button3 = new QPushButton("Hello");
        button3->show(); // If you don't call show(), button3 will be invisible
        

        I am not worried about button3, all I am concerned about is quit button of main.cpp file.

        I made following change in main.cpp

        quit.move(80,80)
        

        and w.show() is already there in main.cpp

        Then, why isn't quit button showing up in my window whereas other two buttons signup and 'Click Here' appear?

        “ In order to be irreplaceable, one must always be different” – Coco Chanel

        J 1 Reply Last reply 8 Dec 2021, 12:44
        0
        • S Offline
          S Offline
          SimonSchroeder
          wrote on 8 Dec 2021, 07:56 last edited by
          #35

          You shouldn't move and resize widgets (buttons are also widgets) when you want to use layouts. Layouts will position and resize all their widgets themselves. Most likely layouts will override everything else in the end.

          When you are using a QGridLayout you should always specify the row and column. I am not sure what would happen otherwise. Only with the box layouts it makes sense to not specify a position in the layout as they will then only be appended (to the right in horizontal layouts or to the bottom in vertical layouts).

          About the parents in Qt: Unfortunately, it is a little bit more confusing when you are using layouts than what you have discussed so far. Whenever you add a widget to a layout it will be reparented to the layout's parent. The reason behind this is that for widgets the parent-child relationship also applies to the visual representation. When you show a parent all its children will be shown as well. I personally don't provide a parent when creating child objects (like in new QPushButton("Button")) but rely on the parent being set when I add widgets to a layout (and I exclusively use layouts instead of fixed positioning). Though this is just my personal preference.

          1 Reply Last reply
          1
          • S Swati777999
            8 Dec 2021, 07:33

            @JKSH said in Confusion between the usage of 'this' and 'parent':

            @Swati777999 said in Confusion between the usage of 'this' and 'parent':

            button1 and button2 appear on the window because I have used this->show() at the end.

            // button1 and button2 have a parent, and will appear inside your widget
            button1 = new QPushButton("Click Here", this);
            button2 = new QPushButton("Sign up",this);
            
            // button3 has no parent, and will open in a new window
            button3 = new QPushButton("Hello");
            button3->show(); // If you don't call show(), button3 will be invisible
            

            I am not worried about button3, all I am concerned about is quit button of main.cpp file.

            I made following change in main.cpp

            quit.move(80,80)
            

            and w.show() is already there in main.cpp

            Then, why isn't quit button showing up in my window whereas other two buttons signup and 'Click Here' appear?

            J Offline
            J Offline
            JKSH
            Moderators
            wrote on 8 Dec 2021, 12:44 last edited by
            #36

            @Swati777999 said in Confusion between the usage of 'this' and 'parent':

            Then, why isn't quit button showing up in my window whereas other two buttons signup and 'Click Here' appear?

            I agree with @SimonSchroeder: Since your top-level widget has a layout, do not add a child widget that is not part of that layout. It is not designed to work that way.

            Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

            S 1 Reply Last reply 9 Dec 2021, 01:14
            0
            • J JKSH
              8 Dec 2021, 12:44

              @Swati777999 said in Confusion between the usage of 'this' and 'parent':

              Then, why isn't quit button showing up in my window whereas other two buttons signup and 'Click Here' appear?

              I agree with @SimonSchroeder: Since your top-level widget has a layout, do not add a child widget that is not part of that layout. It is not designed to work that way.

              S Offline
              S Offline
              Swati777999
              wrote on 9 Dec 2021, 01:14 last edited by
              #37

              @JKSH

              What do you mean by top-level widget? Is it the one declared in main.cpp ; i.e quit button?

              “ In order to be irreplaceable, one must always be different” – Coco Chanel

              J 1 Reply Last reply 9 Dec 2021, 01:22
              0
              • S Swati777999
                9 Dec 2021, 01:14

                @JKSH

                What do you mean by top-level widget? Is it the one declared in main.cpp ; i.e quit button?

                J Offline
                J Offline
                JKSH
                Moderators
                wrote on 9 Dec 2021, 01:22 last edited by JKSH 12 Sept 2021, 01:25
                #38

                @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                @JKSH

                What do you mean by top-level widget? Is it the one declared in main.cpp ; i.e quit button?

                A top-level widget is a widget that has its own window.

                In your code, button1 and button2 are not top-level widgets because they don't have their own windows. Instead, they are inside w's window.

                Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                1 Reply Last reply
                1
                • S Swati777999
                  7 Dec 2021, 08:01

                  @Christian-Ehrlicher
                  There's only one example in the documentation.

                  The following code is something I tried on my own.

                  layoutexample.h

                  #ifndef LAYOUTEXAMPLE_H
                  #define LAYOUTEXAMPLE_H
                  
                  #include <QMainWindow>
                  #include <QWidget>
                  #include <QTableWidget>
                  #include <QGridLayout>
                  #include <QPushButton>
                  #include <QMenuBar>
                  
                  class LayoutExample : public QMainWindow
                  {
                      Q_OBJECT
                      QWidget *box;
                      QGridLayout *gridLay;
                      QPushButton *button1;
                      QPushButton *button2;
                  
                  public:
                      LayoutExample(QWidget *parent=nullptr);
                      ~LayoutExample();
                  };
                  #endif // LAYOUTEXAMPLE_H
                  
                  

                  layoutexample.cpp

                  #include "layoutexample.h"
                  #include <QGridLayout>
                  #include <QWidget>
                  #include <QTableWidget>
                  #include <QPushButton>
                  #include <QMenuBar>
                  
                  LayoutExample::LayoutExample(QWidget *parent)
                      : QMainWindow(parent)
                  {
                      box = new QWidget();
                      button1=new QPushButton("Click Here");
                      button2 = new QPushButton("Sign up");
                      gridLay = new QGridLayout();
                      box->setFixedSize(100,100);
                  
                      gridLay->setRowMinimumHeight(5,4);
                      gridLay->setHorizontalSpacing(20);
                      gridLay->addWidget(box);
                      gridLay->addWidget(button1);
                      gridLay->addWidget(button2);
                  
                      this->setLayout(gridLay);
                      //this->parentWidget()->setLayout(gridLay);
                  }
                  
                  LayoutExample::~LayoutExample()
                  {
                  }
                  
                  

                  In the above code, in place of 'this' when I write parent , my program crashes. This code does not add widgets to the main window. Only the effects of codes of main.cpp are reflected in the main window.

                  How can I use w parent Qobject from main.cpp in layout.cpp? [I am so confused about the structure of writing codes in these 3 files and parent-child implementation]

                  Does parent in layout.cpp refer to w ?
                  main.cpp

                  #include "layoutexample.h"
                  
                  #include <QApplication>
                  #include <QWidget>
                  #include <QTableWidget>
                  #include <QMenuBar>
                  
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication a(argc, argv);
                  
                      LayoutExample w;  // w: parent QObject
                      QPushButton quit("Quit",&w);      // quit: child QObject
                      quit.move(100,100); // x and y coordinates of widgets wrt to the mainwindow
                      w.setWindowTitle("Layout Example");
                      quit.setBaseSize(100,100);
                      quit.setAutoFillBackground("yes");
                  
                      QGridLayout grid(&w);    
                     //w.setLayout(grid);
                  
                      w.show();
                      return a.exec();
                  }
                  
                  }
                  

                  Edit: I've changed the name of the project from layout to layoutExample to avoid confusion.

                  S Offline
                  S Offline
                  Swati777999
                  wrote on 9 Dec 2021, 01:28 last edited by
                  #39

                  @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                  @Christian-Ehrlicher
                  There's only one example in the documentation.

                  The following code is something I tried on my own.

                  layoutexample.h

                  #ifndef LAYOUTEXAMPLE_H
                  #define LAYOUTEXAMPLE_H
                  
                  #include <QMainWindow>
                  #include <QWidget>
                  #include <QTableWidget>
                  #include <QGridLayout>
                  #include <QPushButton>
                  #include <QMenuBar>
                  
                  class LayoutExample : public QMainWindow
                  {
                      Q_OBJECT
                      QWidget *box;
                      QGridLayout *gridLay;
                      QPushButton *button1;
                      QPushButton *button2;
                  
                  public:
                      LayoutExample(QWidget *parent=nullptr);
                      ~LayoutExample();
                  };
                  #endif // LAYOUTEXAMPLE_H
                  
                  

                  layoutexample.cpp

                  #include "layoutexample.h"
                  #include <QGridLayout>
                  #include <QWidget>
                  #include <QTableWidget>
                  #include <QPushButton>
                  #include <QMenuBar>
                  
                  LayoutExample::LayoutExample(QWidget *parent)
                      : QMainWindow(parent)
                  {
                      box = new QWidget();
                      button1=new QPushButton("Click Here");
                      button2 = new QPushButton("Sign up");
                      gridLay = new QGridLayout();
                      box->setFixedSize(100,100);
                  
                      gridLay->setRowMinimumHeight(5,4);
                      gridLay->setHorizontalSpacing(20);
                      gridLay->addWidget(box);
                      gridLay->addWidget(button1);
                      gridLay->addWidget(button2);
                  
                      this->setLayout(gridLay);
                      //this->parentWidget()->setLayout(gridLay);
                  }
                  
                  LayoutExample::~LayoutExample()
                  {
                  }
                  
                  

                  In the above code, in place of 'this' when I write parent , my program crashes. This code does not add widgets to the main window. Only the effects of codes of main.cpp are reflected in the main window.

                  How can I use w parent Qobject from main.cpp in layout.cpp? [I am so confused about the structure of writing codes in these 3 files and parent-child implementation]

                  Does parent in layout.cpp refer to w ?
                  main.cpp

                  #include "layoutexample.h"
                  
                  #include <QApplication>
                  #include <QWidget>
                  #include <QTableWidget>
                  #include <QMenuBar>
                  
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication a(argc, argv);
                  
                      LayoutExample w;  // w: parent QObject
                      QPushButton quit("Quit",&w);      // quit: child QObject
                      quit.move(100,100); // x and y coordinates of widgets wrt to the mainwindow
                      w.setWindowTitle("Layout Example");
                      quit.setBaseSize(100,100);
                      quit.setAutoFillBackground("yes");
                  
                      QGridLayout grid(&w);    
                     //w.setLayout(grid);
                  
                      w.show();
                      return a.exec();
                  }
                  
                  }
                  

                  Edit: I've changed the name of the project from layout to layoutExample to avoid confusion.

                  @JKSH
                  Another observation here,
                  In layoutExample.cpp , [ in main.cpp , w.show() is present as it is ]
                  CASE-1
                  In the presence of

                  this->show();
                  
                  

                  following result is obtained ;
                  Layout_Example3.PNG

                  CASE-2
                  When I comment

                  //this->show();
                  

                  I get the following result
                  layout_Example2.PNG

                  My doubt here is ; in CASE-2, why should these buttons; Sign up and Click Here appear as this->show() is commented?

                  In CASE-1 , why does quit button from main.cpp appear in the same window?

                  Please explain the reason.

                  Thanks!

                  “ In order to be irreplaceable, one must always be different” – Coco Chanel

                  P 1 Reply Last reply 9 Dec 2021, 03:24
                  0
                  • S Swati777999
                    9 Dec 2021, 01:28

                    @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                    @Christian-Ehrlicher
                    There's only one example in the documentation.

                    The following code is something I tried on my own.

                    layoutexample.h

                    #ifndef LAYOUTEXAMPLE_H
                    #define LAYOUTEXAMPLE_H
                    
                    #include <QMainWindow>
                    #include <QWidget>
                    #include <QTableWidget>
                    #include <QGridLayout>
                    #include <QPushButton>
                    #include <QMenuBar>
                    
                    class LayoutExample : public QMainWindow
                    {
                        Q_OBJECT
                        QWidget *box;
                        QGridLayout *gridLay;
                        QPushButton *button1;
                        QPushButton *button2;
                    
                    public:
                        LayoutExample(QWidget *parent=nullptr);
                        ~LayoutExample();
                    };
                    #endif // LAYOUTEXAMPLE_H
                    
                    

                    layoutexample.cpp

                    #include "layoutexample.h"
                    #include <QGridLayout>
                    #include <QWidget>
                    #include <QTableWidget>
                    #include <QPushButton>
                    #include <QMenuBar>
                    
                    LayoutExample::LayoutExample(QWidget *parent)
                        : QMainWindow(parent)
                    {
                        box = new QWidget();
                        button1=new QPushButton("Click Here");
                        button2 = new QPushButton("Sign up");
                        gridLay = new QGridLayout();
                        box->setFixedSize(100,100);
                    
                        gridLay->setRowMinimumHeight(5,4);
                        gridLay->setHorizontalSpacing(20);
                        gridLay->addWidget(box);
                        gridLay->addWidget(button1);
                        gridLay->addWidget(button2);
                    
                        this->setLayout(gridLay);
                        //this->parentWidget()->setLayout(gridLay);
                    }
                    
                    LayoutExample::~LayoutExample()
                    {
                    }
                    
                    

                    In the above code, in place of 'this' when I write parent , my program crashes. This code does not add widgets to the main window. Only the effects of codes of main.cpp are reflected in the main window.

                    How can I use w parent Qobject from main.cpp in layout.cpp? [I am so confused about the structure of writing codes in these 3 files and parent-child implementation]

                    Does parent in layout.cpp refer to w ?
                    main.cpp

                    #include "layoutexample.h"
                    
                    #include <QApplication>
                    #include <QWidget>
                    #include <QTableWidget>
                    #include <QMenuBar>
                    
                    
                    int main(int argc, char *argv[])
                    {
                        QApplication a(argc, argv);
                    
                        LayoutExample w;  // w: parent QObject
                        QPushButton quit("Quit",&w);      // quit: child QObject
                        quit.move(100,100); // x and y coordinates of widgets wrt to the mainwindow
                        w.setWindowTitle("Layout Example");
                        quit.setBaseSize(100,100);
                        quit.setAutoFillBackground("yes");
                    
                        QGridLayout grid(&w);    
                       //w.setLayout(grid);
                    
                        w.show();
                        return a.exec();
                    }
                    
                    }
                    

                    Edit: I've changed the name of the project from layout to layoutExample to avoid confusion.

                    @JKSH
                    Another observation here,
                    In layoutExample.cpp , [ in main.cpp , w.show() is present as it is ]
                    CASE-1
                    In the presence of

                    this->show();
                    
                    

                    following result is obtained ;
                    Layout_Example3.PNG

                    CASE-2
                    When I comment

                    //this->show();
                    

                    I get the following result
                    layout_Example2.PNG

                    My doubt here is ; in CASE-2, why should these buttons; Sign up and Click Here appear as this->show() is commented?

                    In CASE-1 , why does quit button from main.cpp appear in the same window?

                    Please explain the reason.

                    Thanks!

                    P Offline
                    P Offline
                    Pl45m4
                    wrote on 9 Dec 2021, 03:24 last edited by Pl45m4 12 Sept 2021, 03:35
                    #40

                    @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                    In CASE-1 , why does quit button from main.cpp appear in the same window?

                    Because you've set w as parent of your quit button. So it appears in parent coodinates. If you remove the &w from your quit button's c'tor and still move it to, say (100, 100) and show it afterwards, it should appear as standalone widget at 100,100 from TOP-LEFT corner of your SCREEN.

                    Btw: You should really use your layouts, not create them and then just throw your widgets (buttons) on your parent (LayoutExample window/widget) without actually putting them in a layout.

                    CASE 2

                    where is your this->show() located?! Cant tell right now...
                    The other 2 buttons are there because they are children of LayoutExample widget.... and you still show it with w.show() in your main()


                    If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                    ~E. W. Dijkstra

                    S 2 Replies Last reply 9 Dec 2021, 03:34
                    1
                    • P Pl45m4
                      9 Dec 2021, 03:24

                      @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                      In CASE-1 , why does quit button from main.cpp appear in the same window?

                      Because you've set w as parent of your quit button. So it appears in parent coodinates. If you remove the &w from your quit button's c'tor and still move it to, say (100, 100) and show it afterwards, it should appear as standalone widget at 100,100 from TOP-LEFT corner of your SCREEN.

                      Btw: You should really use your layouts, not create them and then just throw your widgets (buttons) on your parent (LayoutExample window/widget) without actually putting them in a layout.

                      CASE 2

                      where is your this->show() located?! Cant tell right now...
                      The other 2 buttons are there because they are children of LayoutExample widget.... and you still show it with w.show() in your main()

                      S Offline
                      S Offline
                      Swati777999
                      wrote on 9 Dec 2021, 03:34 last edited by
                      #41

                      @Pl45m4 said in Confusion between the usage of 'this' and 'parent':

                      @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                      CASE 2

                      where is your this->show() located?! Cant tell right now...

                      As mentioned in my previous reply, this->show() is located in layoutExample.cpp file.

                      “ In order to be irreplaceable, one must always be different” – Coco Chanel

                      P 1 Reply Last reply 9 Dec 2021, 03:49
                      0
                      • S Swati777999
                        9 Dec 2021, 03:34

                        @Pl45m4 said in Confusion between the usage of 'this' and 'parent':

                        @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                        CASE 2

                        where is your this->show() located?! Cant tell right now...

                        As mentioned in my previous reply, this->show() is located in layoutExample.cpp file.

                        P Offline
                        P Offline
                        Pl45m4
                        wrote on 9 Dec 2021, 03:49 last edited by Pl45m4 12 Sept 2021, 03:51
                        #42

                        @Swati777999

                        Shouldn't make any difference since this in your LayoutExample class and w in main are pretty much the same objects/instances. It's just the point when you show it. Using this->show at the end of c'tor shows the widget right after it is constructed. Then you do some stuff in main() and then w.show() would display it anyway.


                        If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                        ~E. W. Dijkstra

                        S 1 Reply Last reply 9 Dec 2021, 03:56
                        1
                        • P Pl45m4
                          9 Dec 2021, 03:49

                          @Swati777999

                          Shouldn't make any difference since this in your LayoutExample class and w in main are pretty much the same objects/instances. It's just the point when you show it. Using this->show at the end of c'tor shows the widget right after it is constructed. Then you do some stuff in main() and then w.show() would display it anyway.

                          S Offline
                          S Offline
                          Swati777999
                          wrote on 9 Dec 2021, 03:56 last edited by
                          #43

                          @Pl45m4

                          My doubt is , even if I comment this->show() in layoutExample.cpp , the widgets in layoutExample.cpp still appear on the screen. How is it possible?

                          “ In order to be irreplaceable, one must always be different” – Coco Chanel

                          J P 2 Replies Last reply 9 Dec 2021, 06:26
                          0
                          • P Pl45m4
                            9 Dec 2021, 03:24

                            @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                            In CASE-1 , why does quit button from main.cpp appear in the same window?

                            Because you've set w as parent of your quit button. So it appears in parent coodinates. If you remove the &w from your quit button's c'tor and still move it to, say (100, 100) and show it afterwards, it should appear as standalone widget at 100,100 from TOP-LEFT corner of your SCREEN.

                            Btw: You should really use your layouts, not create them and then just throw your widgets (buttons) on your parent (LayoutExample window/widget) without actually putting them in a layout.

                            CASE 2

                            where is your this->show() located?! Cant tell right now...
                            The other 2 buttons are there because they are children of LayoutExample widget.... and you still show it with w.show() in your main()

                            S Offline
                            S Offline
                            Swati777999
                            wrote on 9 Dec 2021, 04:19 last edited by
                            #44

                            @Pl45m4 said in Confusion between the usage of 'this' and 'parent':

                            @Swati777999 said in Confusion between the usage of 'this' and 'parent':
                            Btw: You should really use your layouts, not create them and then just throw your widgets (buttons) on your parent (LayoutExample window/widget) without actually putting them in a layout.

                            I've used gridlayout for the widgets in layoutExample.cpp , you can check it below(as a part of layoutExample.cpp) but it seems that the layout has not been applied successfully.

                            LayoutExample::LayoutExample(QWidget *parent)
                                : QMainWindow(parent)
                            {
                                box = new QWidget(this);
                                button1=new QPushButton("Click Here",this);
                                button2 = new QPushButton("Sign up",this);
                                button1->move(200,200);
                                button2->move(100,100);
                                gridLay = new QGridLayout(this);
                                box->setFixedSize(50,50);
                            
                                gridLay->addWidget(box);
                                gridLay->addWidget(button1);
                                gridLay->addWidget(button2);
                            
                                this->setLayout(gridLay);
                            
                                this->show();
                            
                                //this->parentWidget()->setLayout(gridLay);
                            }
                            

                            “ In order to be irreplaceable, one must always be different” – Coco Chanel

                            J 1 Reply Last reply 9 Dec 2021, 04:25
                            0
                            • S Swati777999
                              9 Dec 2021, 04:19

                              @Pl45m4 said in Confusion between the usage of 'this' and 'parent':

                              @Swati777999 said in Confusion between the usage of 'this' and 'parent':
                              Btw: You should really use your layouts, not create them and then just throw your widgets (buttons) on your parent (LayoutExample window/widget) without actually putting them in a layout.

                              I've used gridlayout for the widgets in layoutExample.cpp , you can check it below(as a part of layoutExample.cpp) but it seems that the layout has not been applied successfully.

                              LayoutExample::LayoutExample(QWidget *parent)
                                  : QMainWindow(parent)
                              {
                                  box = new QWidget(this);
                                  button1=new QPushButton("Click Here",this);
                                  button2 = new QPushButton("Sign up",this);
                                  button1->move(200,200);
                                  button2->move(100,100);
                                  gridLay = new QGridLayout(this);
                                  box->setFixedSize(50,50);
                              
                                  gridLay->addWidget(box);
                                  gridLay->addWidget(button1);
                                  gridLay->addWidget(button2);
                              
                                  this->setLayout(gridLay);
                              
                                  this->show();
                              
                                  //this->parentWidget()->setLayout(gridLay);
                              }
                              
                              J Offline
                              J Offline
                              JKSH
                              Moderators
                              wrote on 9 Dec 2021, 04:25 last edited by JKSH 12 Sept 2021, 04:33
                              #45

                              @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                              My doubt here is ; in CASE-2, why should these buttons; Sign up and Click Here appear as this->show() is commented?

                              In CASE-1 , why does quit button from main.cpp appear in the same window?

                              Please explain the reason.

                              I think you've got CASE-1 and CASE-2 mixed up. quit will show if this->show() is commented.

                              The reason is this: When you call show() on a widget, it also automatically calls show() on all of the widget's children.

                              • When you show w before setting it as the parent of quit, then quit won't be shown. You must call quit.show() manually.
                              • When you show w after setting it as the parent of quit, then quit will be automatically shown.

                              But more importantly: You don't need to spend time worrying about things like this. If you just put ALL of your child widgets inside layouts, then you won't encounter these strange behaviours!

                              I've used gridlayout for the widgets... but it seems that the layout has not been applied successfully.

                              Look, both @SimonSchroeder and I have told you already: You must specify the row and column when you call QGridLayout::addWidget(): https://doc.qt.io/qt-5/qgridlayout.html#addWidget-1

                              It irritates us when you ignore our advice and then repeat the same issue.

                              Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                              S 1 Reply Last reply 9 Dec 2021, 05:00
                              1
                              • J JKSH
                                9 Dec 2021, 04:25

                                @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                                My doubt here is ; in CASE-2, why should these buttons; Sign up and Click Here appear as this->show() is commented?

                                In CASE-1 , why does quit button from main.cpp appear in the same window?

                                Please explain the reason.

                                I think you've got CASE-1 and CASE-2 mixed up. quit will show if this->show() is commented.

                                The reason is this: When you call show() on a widget, it also automatically calls show() on all of the widget's children.

                                • When you show w before setting it as the parent of quit, then quit won't be shown. You must call quit.show() manually.
                                • When you show w after setting it as the parent of quit, then quit will be automatically shown.

                                But more importantly: You don't need to spend time worrying about things like this. If you just put ALL of your child widgets inside layouts, then you won't encounter these strange behaviours!

                                I've used gridlayout for the widgets... but it seems that the layout has not been applied successfully.

                                Look, both @SimonSchroeder and I have told you already: You must specify the row and column when you call QGridLayout::addWidget(): https://doc.qt.io/qt-5/qgridlayout.html#addWidget-1

                                It irritates us when you ignore our advice and then repeat the same issue.

                                S Offline
                                S Offline
                                Swati777999
                                wrote on 9 Dec 2021, 05:00 last edited by
                                #46

                                @JKSH

                                Yes, I remember your advice of giving a dimension to my layout to make it appear on the screen, I was mistakenly putting row,column parameters while creating gridLay as a result of which I was getting errors repeatedly but now , I understood the concept.

                                gridLay->addWidget(button1,100,120,Qt::Alignment=0x0020);

                                The third argument gives me an error. How should the value of alignment be used?
                                Qt::Alignment=0x0020

                                “ In order to be irreplaceable, one must always be different” – Coco Chanel

                                J.HilkJ 1 Reply Last reply 9 Dec 2021, 06:10
                                0
                                • S Swati777999
                                  9 Dec 2021, 05:00

                                  @JKSH

                                  Yes, I remember your advice of giving a dimension to my layout to make it appear on the screen, I was mistakenly putting row,column parameters while creating gridLay as a result of which I was getting errors repeatedly but now , I understood the concept.

                                  gridLay->addWidget(button1,100,120,Qt::Alignment=0x0020);

                                  The third argument gives me an error. How should the value of alignment be used?
                                  Qt::Alignment=0x0020

                                  J.HilkJ Offline
                                  J.HilkJ Offline
                                  J.Hilk
                                  Moderators
                                  wrote on 9 Dec 2021, 06:10 last edited by
                                  #47

                                  @Swati777999

                                  gridLay->addWidget(button1,100,120,Qt::Alignment=0x0020);
                                  

                                  100,120 does not mean the pixels on your screen, but row/column 100/120

                                  try placing your first widget on column/row 0 and use the actual enum not the integer value as 4th paramter

                                  gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                  

                                  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.

                                  S 1 Reply Last reply 9 Dec 2021, 06:22
                                  1
                                  • J.HilkJ J.Hilk
                                    9 Dec 2021, 06:10

                                    @Swati777999

                                    gridLay->addWidget(button1,100,120,Qt::Alignment=0x0020);
                                    

                                    100,120 does not mean the pixels on your screen, but row/column 100/120

                                    try placing your first widget on column/row 0 and use the actual enum not the integer value as 4th paramter

                                    gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                    
                                    S Offline
                                    S Offline
                                    Swati777999
                                    wrote on 9 Dec 2021, 06:22 last edited by
                                    #48

                                    @J-Hilk

                                    After modifying the existing code, gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                    I can't find any change in my display. :(

                                    “ In order to be irreplaceable, one must always be different” – Coco Chanel

                                    1 Reply Last reply
                                    0
                                    • S Swati777999
                                      9 Dec 2021, 03:56

                                      @Pl45m4

                                      My doubt is , even if I comment this->show() in layoutExample.cpp , the widgets in layoutExample.cpp still appear on the screen. How is it possible?

                                      J Offline
                                      J Offline
                                      JKSH
                                      Moderators
                                      wrote on 9 Dec 2021, 06:26 last edited by JKSH 12 Sept 2021, 06:27
                                      #49

                                      @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                                      My doubt is , even if I comment this->show() in layoutExample.cpp , the widgets in layoutExample.cpp still appear on the screen. How is it possible?

                                      Because you called w.show().

                                      After modifying the existing code, gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                      I can't find any change in my display. :(

                                      First: Instead of QMainWindow, make your widget inherit QWidget. This makes things simpler.

                                      Second: You only put one button in the layout. You should put ALL buttons in the layout. Remember to use different rows/columns for each button.

                                      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                                      S 2 Replies Last reply 9 Dec 2021, 08:19
                                      2
                                      • J JKSH
                                        9 Dec 2021, 06:26

                                        @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                                        My doubt is , even if I comment this->show() in layoutExample.cpp , the widgets in layoutExample.cpp still appear on the screen. How is it possible?

                                        Because you called w.show().

                                        After modifying the existing code, gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                        I can't find any change in my display. :(

                                        First: Instead of QMainWindow, make your widget inherit QWidget. This makes things simpler.

                                        Second: You only put one button in the layout. You should put ALL buttons in the layout. Remember to use different rows/columns for each button.

                                        S Offline
                                        S Offline
                                        Swati777999
                                        wrote on 9 Dec 2021, 08:19 last edited by
                                        #50

                                        @JKSH

                                        This is the LayoutExample.cpp

                                        LayoutExample::LayoutExample(QWidget *parent)
                                            : QMainWindow(parent)
                                        {
                                        ............
                                        }
                                        

                                        In place of QMainWindow, if I put QWidget, it gives an error. For example:

                                        LayoutExample::LayoutExample(QWidget *parent)
                                            : QWidget(parent)
                                        {
                                        ............
                                        }
                                        

                                        “ In order to be irreplaceable, one must always be different” – Coco Chanel

                                        J 1 Reply Last reply 9 Dec 2021, 08:28
                                        0
                                        • J JKSH
                                          9 Dec 2021, 06:26

                                          @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                                          My doubt is , even if I comment this->show() in layoutExample.cpp , the widgets in layoutExample.cpp still appear on the screen. How is it possible?

                                          Because you called w.show().

                                          After modifying the existing code, gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                          I can't find any change in my display. :(

                                          First: Instead of QMainWindow, make your widget inherit QWidget. This makes things simpler.

                                          Second: You only put one button in the layout. You should put ALL buttons in the layout. Remember to use different rows/columns for each button.

                                          S Offline
                                          S Offline
                                          Swati777999
                                          wrote on 9 Dec 2021, 08:21 last edited by
                                          #51

                                          @JKSH said in Confusion between the usage of 'this' and 'parent':

                                          @Swati777999 said in Confusion between the usage of 'this' and 'parent':

                                          My doubt is , even if I comment this->show() in layoutExample.cpp , the widgets in layoutExample.cpp still appear on the screen. How is it possible?

                                          Because you called w.show().

                                          After modifying the existing code, gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                          I can't find any change in my display. :(

                                          First: Instead of QMainWindow, make your widget inherit QWidget. This makes things simpler.

                                          Second: You only put one button in the layout. You should put ALL buttons in the layout. Remember to use different rows/columns for each button.
                                          This is the complete code, please refer to it.

                                          LayoutExample.cpp

                                          LayoutExample::LayoutExample(QWidget *parent)
                                              : QMainWindow(parent)
                                          
                                          {   gridLay = new QGridLayout(this);
                                              box = new QWidget(this);
                                              button1=new QPushButton("Click Here",this);
                                              button2 = new QPushButton("Sign up",this);
                                              button1->move(200,200);
                                              button2->move(100,100);
                                          
                                              gridLay->addWidget(box,60,60);
                                              gridLay->addWidget(button1,0,0,Qt::AlignTop);
                                              gridLay->addWidget(button2,50,100,Qt::AlignBottom);
                                          
                                              this->setLayout(gridLay);
                                              this->show();
                                          
                                          
                                          }
                                          
                                          LayoutExample::~LayoutExample()
                                          {
                                          }
                                          

                                          “ In order to be irreplaceable, one must always be different” – Coco Chanel

                                          1 Reply Last reply
                                          0

                                          41/55

                                          9 Dec 2021, 03:34

                                          • Login

                                          • Login or register to search.
                                          41 out of 55
                                          • First post
                                            41/55
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved