Syntax for Vector of QPushbuttons added to FlowLayout
-
The primary suggestion is to read the documentation of QScrollArea. It starts:
"A scroll area is used to display the contents of a child widget within a frame. If the widget exceeds the size of the frame, the view can provide scroll bars so that the entire area of the child widget can be viewed. The child widget must be specified with setWidget()."So, it contains and displays a single widget. That widget can contain child widgets in a layout (QGridLayout, QHBoxLayout or whatever). You may have to give the container a specific size depending on the widgetResizable property.
You want your buttons inside the widget that you place inside the QScrollArea.@ChrisW67 said in Syntax for Vector of QPushbuttons added to FlowLayout:
The primary suggestion is to read the documentation of QScrollArea. It starts:
"A scroll area is used to display the contents of a child widget within a frame. If the widget exceeds the size of the frame, the view can provide scroll bars so that the entire area of the child widget can be viewed. The child widget must be specified with setWidget()."So, it contains and displays a single widget. That widget can contain child widgets in a layout (QGridLayout, QHBoxLayout or whatever). You may have to give the container a specific size depending on the widgetResizable property.
You want your buttons inside the widget that you place inside the QScrollArea.{ FlowLayout *flowLayout = new FlowLayout; int n=20; QWidget *parentWidget =new QWidget(this); QGridLayout *parentLayout =new QGridLayout(parentWidget); parentWidget->setLayout(parentLayout); parentLayout->addLayout(flowLayout,0,0); //Adding child layout to parentlayout QWidget *childWidget = new QWidget(); //Child Widget for flowLayout QVector <QPushButton *> buttons(n); QScrollArea *scrollArea = new QScrollArea(); for (int ii=0;ii<n;ii++) { QPushButton * pb = new QPushButton(); // creating button pb->setMinimumSize(200,200); buttons.push_back(pb); // adding buttons to qvector flowLayout->addWidget(pb); childWidget->setLayout(flowLayout); } scrollArea->setWidget(childWidget); this->show(); }
I followed your instructions to modify my code but scrollArea operation does not seem to be working.
-
@ChrisW67 said in Syntax for Vector of QPushbuttons added to FlowLayout:
The primary suggestion is to read the documentation of QScrollArea. It starts:
"A scroll area is used to display the contents of a child widget within a frame. If the widget exceeds the size of the frame, the view can provide scroll bars so that the entire area of the child widget can be viewed. The child widget must be specified with setWidget()."So, it contains and displays a single widget. That widget can contain child widgets in a layout (QGridLayout, QHBoxLayout or whatever). You may have to give the container a specific size depending on the widgetResizable property.
You want your buttons inside the widget that you place inside the QScrollArea.{ FlowLayout *flowLayout = new FlowLayout; int n=20; QWidget *parentWidget =new QWidget(this); QGridLayout *parentLayout =new QGridLayout(parentWidget); parentWidget->setLayout(parentLayout); parentLayout->addLayout(flowLayout,0,0); //Adding child layout to parentlayout QWidget *childWidget = new QWidget(); //Child Widget for flowLayout QVector <QPushButton *> buttons(n); QScrollArea *scrollArea = new QScrollArea(); for (int ii=0;ii<n;ii++) { QPushButton * pb = new QPushButton(); // creating button pb->setMinimumSize(200,200); buttons.push_back(pb); // adding buttons to qvector flowLayout->addWidget(pb); childWidget->setLayout(flowLayout); } scrollArea->setWidget(childWidget); this->show(); }
I followed your instructions to modify my code but scrollArea operation does not seem to be working.
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
scrollArea operation does not seem to be working.
You need to add some code that puts
scrollArea
intothis
. -
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
scrollArea operation does not seem to be working.
You need to add some code that puts
scrollArea
intothis
.@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
scrollArea operation does not seem to be working.
You need to add some code that puts
scrollArea
intothis
.Do you mean that I should write
QScrollArea *scrollArea= new QScrollArea(this);
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
scrollArea operation does not seem to be working.
You need to add some code that puts
scrollArea
intothis
.This is the diagram of the parent-child items of the above code [expected output in the window]
So, you mean I should write
QScrollArea *scrollArea = new QScrollArea(parentWidget);
My program produces buttons in a vertical layout with deactivated scrollbar functionality. -
This is the diagram of the parent-child items of the above code [expected output in the window]
So, you mean I should write
QScrollArea *scrollArea = new QScrollArea(parentWidget);
My program produces buttons in a vertical layout with deactivated scrollbar functionality.@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
So, you mean I should write
QScrollArea *scrollArea = new QScrollArea(parentWidget);
According to your diagram,
- You should add the QPushButtons to flowLayout
- You should add flowLayout to ChildWidget
- You should add ChildWidget to ParentLayout
- You should add ParentLayout to ParentWidget
Can you point out to us: Which part of your code achieves each step?
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
So, you mean I should write
QScrollArea *scrollArea = new QScrollArea(parentWidget);
According to your diagram,
- You should add the QPushButtons to flowLayout
- You should add flowLayout to ChildWidget
- You should add ChildWidget to ParentLayout
- You should add ParentLayout to ParentWidget
Can you point out to us: Which part of your code achieves each step?
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
Find my answers below:
You should add the QPushButtons to flowLayout -
flowLayout->addWidget(pb);
//inside the for loopYou should add flowLayout to ChildWidget
childWidget->setLayout(flowLayout);
// Inside the for loopYou should add ChildWidget to ParentLayout
Missed this one in the above code but now I have included the following in my code
parentLayout->addWidget(childWidget); //Adding childWidget to parent layout
After including this code, I am not getting the result. :(You should add ParentLayout to ParentWidget
parentWidget->setLayout(parentLayout);
-
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
Find my answers below:
You should add the QPushButtons to flowLayout -
flowLayout->addWidget(pb);
//inside the for loopYou should add flowLayout to ChildWidget
childWidget->setLayout(flowLayout);
// Inside the for loopYou should add ChildWidget to ParentLayout
Missed this one in the above code but now I have included the following in my code
parentLayout->addWidget(childWidget); //Adding childWidget to parent layout
After including this code, I am not getting the result. :(You should add ParentLayout to ParentWidget
parentWidget->setLayout(parentLayout);
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
You should add the QPushButtons to flowLayout -
flowLayout->addWidget(pb);
//inside the for loopYou should add flowLayout to ChildWidget
childWidget->setLayout(flowLayout);
// Inside the for loopYou should add ChildWidget to ParentLayout
Missed this one in the above code but now I have included the following in my code
parentLayout->addWidget(childWidget); //Adding childWidget to parent layout
After including this code, I am not getting the result. :(You should add ParentLayout to ParentWidget
parentWidget->setLayout(parentLayout);
Yep, these are all good. Next:
- Where does QScrollArea fit in your widget hierarchy? (Remember that QScrollArea is a widget)
- Why do you call
childWidget->setLayout(flowLayout);
multiple times?
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
You should add the QPushButtons to flowLayout -
flowLayout->addWidget(pb);
//inside the for loopYou should add flowLayout to ChildWidget
childWidget->setLayout(flowLayout);
// Inside the for loopYou should add ChildWidget to ParentLayout
Missed this one in the above code but now I have included the following in my code
parentLayout->addWidget(childWidget); //Adding childWidget to parent layout
After including this code, I am not getting the result. :(You should add ParentLayout to ParentWidget
parentWidget->setLayout(parentLayout);
Yep, these are all good. Next:
- Where does QScrollArea fit in your widget hierarchy? (Remember that QScrollArea is a widget)
- Why do you call
childWidget->setLayout(flowLayout);
multiple times?
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
1. Where does QScrollArea fit in your widget hierarchy? (Remember that QScrollArea is a widget)
flowLayout ->addWidget(scrollArea);
flowLayout is the child Layout.2. Why do you call
childWidget->setLayout(flowLayout);
multiple times?
It's by mistake I wrote it. childWidget is the widget for flowLayout. Refer the following code.{ int n=20; QWidget *parentWidget =new QWidget(this); QGridLayout *parentLayout =new QGridLayout(parentWidget); parentWidget->setLayout(parentLayout); FlowLayout *flowLayout = new FlowLayout(); parentLayout->addLayout(flowLayout,1,0); //Adding child layout to parentlayout QWidget *childWidget = new QWidget(); //Child Widget for flowLayout parentLayout->addWidget(childWidget); //Adding childWidget to parent layout QVector <QPushButton *> buttons(n); QScrollArea *scrollArea = new QScrollArea(parentWidget); flowLayout ->addWidget(scrollArea); for (int ii=0;ii<n;ii++) { QPushButton * pb = new QPushButton(); // creating buttons pb->setMinimumSize(200,200); buttons.push_back(pb); // adding buttons to qvector flowLayout->addWidget(pb); } childWidget->setLayout(flowLayout); //setting Layout for the childWidget scrollArea->setWidget(childWidget); scrollArea->widget()->setEnabled(true); this->show(); }
I get the following result after making the change. I don't know what the first box is.
-
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
1. Where does QScrollArea fit in your widget hierarchy? (Remember that QScrollArea is a widget)
flowLayout ->addWidget(scrollArea);
flowLayout is the child Layout.2. Why do you call
childWidget->setLayout(flowLayout);
multiple times?
It's by mistake I wrote it. childWidget is the widget for flowLayout. Refer the following code.{ int n=20; QWidget *parentWidget =new QWidget(this); QGridLayout *parentLayout =new QGridLayout(parentWidget); parentWidget->setLayout(parentLayout); FlowLayout *flowLayout = new FlowLayout(); parentLayout->addLayout(flowLayout,1,0); //Adding child layout to parentlayout QWidget *childWidget = new QWidget(); //Child Widget for flowLayout parentLayout->addWidget(childWidget); //Adding childWidget to parent layout QVector <QPushButton *> buttons(n); QScrollArea *scrollArea = new QScrollArea(parentWidget); flowLayout ->addWidget(scrollArea); for (int ii=0;ii<n;ii++) { QPushButton * pb = new QPushButton(); // creating buttons pb->setMinimumSize(200,200); buttons.push_back(pb); // adding buttons to qvector flowLayout->addWidget(pb); } childWidget->setLayout(flowLayout); //setting Layout for the childWidget scrollArea->setWidget(childWidget); scrollArea->widget()->setEnabled(true); this->show(); }
I get the following result after making the change. I don't know what the first box is.
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
1. Where does QScrollArea fit in your widget hierarchy? (Remember that QScrollArea is a widget)
flowLayout ->addWidget(scrollArea);
flowLayout is the child Layout.Your code puts things in this order:
scrollArea
insideflowLayout
flowLayout
insidechildWidget
childWidget
insidescrollArea
So which of these objects is meant to be the one "outside"?
I suggest you update your diagram and include QScrollArea in the diagram.
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
1. Where does QScrollArea fit in your widget hierarchy? (Remember that QScrollArea is a widget)
flowLayout ->addWidget(scrollArea);
flowLayout is the child Layout.Your code puts things in this order:
scrollArea
insideflowLayout
flowLayout
insidechildWidget
childWidget
insidescrollArea
So which of these objects is meant to be the one "outside"?
I suggest you update your diagram and include QScrollArea in the diagram.
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
So which of these objects is meant to be the one "outside"?
I suggest you update your diagram and include QScrollArea in the diagram.Here's the updated diagram for scrollArea, notice that the scrollArea Widget is in pink color.
-
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
So which of these objects is meant to be the one "outside"?
I suggest you update your diagram and include QScrollArea in the diagram.Here's the updated diagram for scrollArea, notice that the scrollArea Widget is in pink color.
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
Here's the updated diagram for scrollArea, notice that the scrollArea Widget is in pink color.
- According to your diagram,
scrollArea
is insidechildWidget
- According to your code,
childWidget
is insidescrollArea
.
Which one is correct?
Notes:
- I said this before: QScrollArea is a QWidget. You can't put a QScrollArea between your FlowLayout and your buttons.
- In case it's not obvious: QPushButton is also a QWidget.
- Your design is extremely complicated. I suggest you reduce the number of widgets and layouts.
- According to your diagram,
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
Here's the updated diagram for scrollArea, notice that the scrollArea Widget is in pink color.
- According to your diagram,
scrollArea
is insidechildWidget
- According to your code,
childWidget
is insidescrollArea
.
Which one is correct?
Notes:
- I said this before: QScrollArea is a QWidget. You can't put a QScrollArea between your FlowLayout and your buttons.
- In case it's not obvious: QPushButton is also a QWidget.
- Your design is extremely complicated. I suggest you reduce the number of widgets and layouts.
I want to set the scrolling functionality for the array of pushbuttons. That's the reason why I put scrollArea inside the flowLayout.
- According to your diagram,
-
I want to set the scrolling functionality for the array of pushbuttons. That's the reason why I put scrollArea inside the flowLayout.
And where do you want to have your flowLayout?
Your design is really confusing.How about putting a widget with a flowLayout containing your buttons in your ScrollArea?!
Still don't know if that is what you are trying to achieve.
From you figure, it looks like you have a least 1 or 2 (parent) widgets and layouts more than necessarily needed. -
I want to set the scrolling functionality for the array of pushbuttons. That's the reason why I put scrollArea inside the flowLayout.
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
I want to set the scrolling functionality for the array of pushbuttons. That's the reason why I put scrollArea inside the flowLayout.
Then you should:
- Put the flowLayout in a container/child widget
- Put that container/child widget in the scrollArea
But before that, simplify your design and remove the widgets and layouts that you don't need. Both myself and @Pl45m4 have asked you to do this. Please don't ignore our words.
-
And where do you want to have your flowLayout?
Your design is really confusing.How about putting a widget with a flowLayout containing your buttons in your ScrollArea?!
Still don't know if that is what you are trying to achieve.
From you figure, it looks like you have a least 1 or 2 (parent) widgets and layouts more than necessarily needed.@Pl45m4 said in Syntax for Vector of QPushbuttons added to FlowLayout:
How about putting a widget with a flowLayout containing your buttons in your ScrollArea?!
I don't know if my layout design is the correct one. I should be able to navigate to the buttons at the bottom from the top buttons by scrolling. This is my objective. How can it be achieved?
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
I want to set the scrolling functionality for the array of pushbuttons. That's the reason why I put scrollArea inside the flowLayout.
Then you should:
- Put the flowLayout in a container/child widget
- Put that container/child widget in the scrollArea
But before that, simplify your design and remove the widgets and layouts that you don't need. Both myself and @Pl45m4 have asked you to do this. Please don't ignore our words.
Yes, check the revised code as below:
{ QWidget *flowWidget = new QWidget(this); FlowLayout *flowLayout = new FlowLayout(); flowWidget->setLayout(flowLayout); int n=20; QVector <QPushButton *> buttons(n); for (int ii=0;ii<n;ii++) { QPushButton * pb = new QPushButton(); // creating buttons pb->setMinimumSize(200,200); buttons.push_back(pb); // adding buttons to qvector flowLayout->addWidget(pb); } QScrollArea *scroll =new QScrollArea(this); scroll->setWidget(flowWidget); this->show(); }
It gives me following output :
scrollArea inside another window .If I declare
scroll
widget as below:
QScrollArea *scroll =new QScrollArea();
I get a blank window.If I declare
scroll
widget as follows:
QScrollArea *scroll =new QScrollArea(flowWidget);
my program crashes. -
Yes, check the revised code as below:
{ QWidget *flowWidget = new QWidget(this); FlowLayout *flowLayout = new FlowLayout(); flowWidget->setLayout(flowLayout); int n=20; QVector <QPushButton *> buttons(n); for (int ii=0;ii<n;ii++) { QPushButton * pb = new QPushButton(); // creating buttons pb->setMinimumSize(200,200); buttons.push_back(pb); // adding buttons to qvector flowLayout->addWidget(pb); } QScrollArea *scroll =new QScrollArea(this); scroll->setWidget(flowWidget); this->show(); }
It gives me following output :
scrollArea inside another window .If I declare
scroll
widget as below:
QScrollArea *scroll =new QScrollArea();
I get a blank window.If I declare
scroll
widget as follows:
QScrollArea *scroll =new QScrollArea(flowWidget);
my program crashes.@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
Yes, check the revised code as below:
Good! It is much cleaner now.
scrollArea inside another window .
That's because your scrollArea is a child widget but you did not put it inside a layout.
Questions:
- In your latest code, who is scrollArea's parent?
- Do you need scrollArea to be a child widget? In other words, does scrollArea need a parent?
- How would you make scrollArea a top-level widget?
-
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
Yes, check the revised code as below:
Good! It is much cleaner now.
scrollArea inside another window .
That's because your scrollArea is a child widget but you did not put it inside a layout.
Questions:
- In your latest code, who is scrollArea's parent?
- Do you need scrollArea to be a child widget? In other words, does scrollArea need a parent?
- How would you make scrollArea a top-level widget?
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
That's because your scrollArea is a **child widget** but you did not put it inside a **layout.
If I writeflowLayout ->addWidget(scroll);
, my program ends forcefully.Questions:
1. In your latest code, who is scrollArea's parent?
Ans: the mainwindow (I've set its parent to bethis
. As mentioned above, if I set it's parent to be flowWidget,my program crashes.2. Do you need scrollArea to be a child widget? In other words, does scrollArea need a parent?
Ans : It's like the main window is the parent ; its child is flowWidget whose children are buttons , scroll is to be applied to flowWidget such that scroll functionality works for all the buttons simultaneously.Note : I should be able to navigate to the buttons at the bottom from the top buttons by scrolling. This is my objective.
3. How would you make scrollArea a top-level widget?
Ans: It was just a part of my experimentation, as it is not working neither forscroll->setWidget(flowWidget)
nor forQScrollArea *scroll = new QScrollArea (flowWidget);
I hope it makes much sense now/
-
@JKSH said in Syntax for Vector of QPushbuttons added to FlowLayout:
That's because your scrollArea is a **child widget** but you did not put it inside a **layout.
If I writeflowLayout ->addWidget(scroll);
, my program ends forcefully.Questions:
1. In your latest code, who is scrollArea's parent?
Ans: the mainwindow (I've set its parent to bethis
. As mentioned above, if I set it's parent to be flowWidget,my program crashes.2. Do you need scrollArea to be a child widget? In other words, does scrollArea need a parent?
Ans : It's like the main window is the parent ; its child is flowWidget whose children are buttons , scroll is to be applied to flowWidget such that scroll functionality works for all the buttons simultaneously.Note : I should be able to navigate to the buttons at the bottom from the top buttons by scrolling. This is my objective.
3. How would you make scrollArea a top-level widget?
Ans: It was just a part of my experimentation, as it is not working neither forscroll->setWidget(flowWidget)
nor forQScrollArea *scroll = new QScrollArea (flowWidget);
I hope it makes much sense now/
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
I hope it makes much sense now
Not really, at least not to me.
For what purpose is the
FlowWidget
now?
Can't you just assign the flowLayout to your mainWindow?Note: scrollArea can handle one entire widget (with all of its sub-widgets and layouts). As far as I understood, your buttons are on multiple widgets, am I right?!
Don't know how your "scroll from top buttons down to bottom buttons" should work. At least when the entire widget is as big as the parent window.Edit:
Quick fix: set your main widget (whatever it might be, maybescrollArea
?!) as centralWidget withsetCentralWidget(.....)
, so the content covers your whole mainWindow. -
@Swati777999 said in Syntax for Vector of QPushbuttons added to FlowLayout:
I hope it makes much sense now
Not really, at least not to me.
For what purpose is the
FlowWidget
now?
Can't you just assign the flowLayout to your mainWindow?Note: scrollArea can handle one entire widget (with all of its sub-widgets and layouts). As far as I understood, your buttons are on multiple widgets, am I right?!
Don't know how your "scroll from top buttons down to bottom buttons" should work. At least when the entire widget is as big as the parent window.Edit:
Quick fix: set your main widget (whatever it might be, maybescrollArea
?!) as centralWidget withsetCentralWidget(.....)
, so the content covers your whole mainWindow.@Pl45m4 said in Syntax for Vector of QPushbuttons added to FlowLayout:
For what purpose is the
FlowWidget
now?Can't you just assign the flowLayout to your mainWindow?
Yes, this is what I did at the first place but I followed the suggestion of @JKSH for implementing the scrollArea for all button widgets.Then you should: Put the flowLayout in a container/child widget Put that container/child widget in the scrollArea
So, I put the entire flowlayout inside a flowWidget.
Note: scrollArea can handle one entire widget (with all of its sub-widgets and layouts). As far as I understood, your buttons are on multiple widgets, am I right?!
Yes, my buttons are arrays of widgets. I want to enable scrolling property just the way I use this link of this forum ; to be able to navigate from top to bottom of this page where the contents of my windows are buttons.Don't know how your "scroll from top buttons down to bottom buttons" should work. At least when the entire widgets is as big as the parent window.
I want to navigate to the bottom of the mainwindow through the scrollbar where the contents of the mainWindow are buttons , just like the following picture; scrollbar in the bottom and right side. In the figure, there are 20 push buttons but I can only view 12 out of them in my window.