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'

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
    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 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 Offline
      J 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 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
              • S Swati777999
                9 Dec 2021, 08:19

                @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)
                {
                ............
                }
                
                J Offline
                J Offline
                JKSH
                Moderators
                wrote on 9 Dec 2021, 08:28 last edited by
                #52

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

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

                You must update your .h file too.

                gridLay->addWidget(box,60,60);
                gridLay->addWidget(button1,0,0,Qt::AlignTop);
                gridLay->addWidget(button2,50,100,Qt::AlignBottom);
                

                You want to specify row/column number. Not pixel number.

                I suggest you use a QVBoxLayout for now. It's simpler than QGridLayout.

                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, 08:44
                2
                • J JKSH
                  9 Dec 2021, 08:28

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

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

                  You must update your .h file too.

                  gridLay->addWidget(box,60,60);
                  gridLay->addWidget(button1,0,0,Qt::AlignTop);
                  gridLay->addWidget(button2,50,100,Qt::AlignBottom);
                  

                  You want to specify row/column number. Not pixel number.

                  I suggest you use a QVBoxLayout for now. It's simpler than QGridLayout.

                  S Offline
                  S Offline
                  Swati777999
                  wrote on 9 Dec 2021, 08:44 last edited by
                  #53

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

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

                  You must update your .h file too.
                  Done! It works now!
                  Layout_Example4.PNG

                  gridLay->addWidget(box,60,60);
                  gridLay->addWidget(button1,0,0,Qt::AlignTop);
                  gridLay->addWidget(button2,50,100,Qt::AlignBottom);
                  

                  You want to specify row/column number. Not pixel number.
                  Noted!

                  I suggest you use a QVBoxLayout for now. It's simpler than QGridLayout.
                  Okay

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

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

                    P Offline
                    P Offline
                    Pl45m4
                    wrote on 9 Dec 2021, 15:04 last edited by Pl45m4 12 Sept 2021, 15:06
                    #54

                    @Swati777999

                    As I've said, because you still show your LayoutExample in your main with w.show().... and this will show the MainWindow widget and ALL its children including your buttons.

                    Edit:
                    @JKSH sry :) Missed the sentence in your reply where you also said that


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

                    ~E. W. Dijkstra

                    J 1 Reply Last reply 9 Dec 2021, 23:55
                    1
                    • P Pl45m4
                      9 Dec 2021, 15:04

                      @Swati777999

                      As I've said, because you still show your LayoutExample in your main with w.show().... and this will show the MainWindow widget and ALL its children including your buttons.

                      Edit:
                      @JKSH sry :) Missed the sentence in your reply where you also said that

                      J Offline
                      J Offline
                      JKSH
                      Moderators
                      wrote on 9 Dec 2021, 23:55 last edited by
                      #55

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

                      @JKSH sry :) Missed the sentence in your reply where you also said that

                      No prob! It's good to have multiple confirm the same thing

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

                      1 Reply Last reply
                      0

                      55/55

                      9 Dec 2021, 23:55

                      • Login

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