PDA

View Full Version : what to do to make windows non-resizable?



jamadagni
14th April 2007, 07:38
Please find a small project of mine attached. I would like to know what to do to make the window non-resizable. I tried setting the sizePolicy of the main window to Fixed,Fixed (in Designer) but it still is resizable. What am I missing? Thanks in advance.

marcel
14th April 2007, 07:46
In Ui.cpp, at the end of the constructor, put:



setFixedSize( sizeHint () );



Regards.

wysota
14th April 2007, 07:56
There is a better way:

layout()->setSizeConstraint(QLayout::SetFixedSize);
This way it'll adjust the size when the size hint changes.

marcel
14th April 2007, 07:58
:) It's the same:



QLayout::SetFixedSize
The main widget's size is set to sizeHint (http://www.qtcentre.org/forum/qlayoutitem.html#sizeHint)(); it cannot be resized at all.


Regards

wysota
14th April 2007, 08:16
It's not the same. When the size hint changes (for example becomes smaller) my code will resize the widget. Yours won't. One is dynamic, the other is static.

marcel
14th April 2007, 08:25
To Wysota:

Ok, you're right :) :


case SetFixedSize:
// will trigger resize
mw->setFixedSize(totalSizeHint());
break;
( it's from qlayout.cpp , in function activate ).

But I believe both approaches will have the same effect on the attached dialog because from what I can see in the attachments, none of the widgets are resized dynamically, once the dialog is made visible.

wysota
14th April 2007, 08:30
But I believe both approaches will have the same effect on the attached dialog because from what I can see in the attachments, none of the widgets are resized dynamically, once the dialog is made visible.

What if the font or language changes?

marcel
14th April 2007, 08:33
OK, you got me :)

jamadagni
14th April 2007, 08:47
Thanks to all who replied.

I added:


layout() -> setSizeConstraint ( QLayout :: SetFixedSize ) ;

at line 40 of ui.cpp but now I get a very tiny window which shows nothing. I am now unable to resize the window which would be good except I can't see anything at all.

jamadagni
14th April 2007, 08:48
I also don't understand why setting the sizePolicy to Fixed isn't enough to do this.

wysota
14th April 2007, 08:51
I added:


layout() -> setSizeConstraint ( QLayout :: SetFixedSize ) ;

at line 40 of ui.cpp but now I get a very tiny window which shows nothing. I am now unable to resize the window which would be good except I can't see anything at all.

It probably means you didn't apply a layout to the form or somewhere lower in the hierarchy.



I also don't understand why setting the sizePolicy to Fixed isn't enough to do this.

Because sizePolicy only works for a widget that is inside a layout and obviously a top-level window (like yours) is not inside one.

marcel
14th April 2007, 08:52
Because your ui doesn't have a layout set.

I have attached the fixed version. Try it. Should work now...
I just set a vertical layout to your window.

Regards.

jamadagni
14th April 2007, 09:22
Thanks it works, but I still have a few questions:


I created the UI file using Designer. Is it a designer bug that it did not create a layout object?

Should setSizePolicy(Fixed) not be enough to declare the window of fixed-size? After all that is the definition of Fixed:



QSizePolicy Class Reference:

QSizePolicy::Fixed : 0 : The QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button).

Why does Qt Designer not use this method itself?

Why does Qt Designer by default create a centralWidget(QWidget) and layoutWidget(QVBoxLayout)? What is their use?

marcel
14th April 2007, 09:33
1. No, it is not a bug. You should layout your widgets.
As Wysota pointed out, QMainWindow is not a regular widget. It does not have a parent widget, therefore no layout to manage it's size and position.

2. Not sure what you mean? Do you mean why there isn't an option to set the size constraint? Maybe because the designer doesn't know the actual (runtime) contents of the widgets and this would mix things up ( could give you a wrong preview of the dialog ).

3. Probably just for preview reasons. But that shouldn't make things worse for you. You can always break the layout and set another one.

Regards

jamadagni
14th April 2007, 10:30
1. No, it is not a bug. You should layout your widgets.
Of course I have laid-out my widgets. See the red line?


As Wysota pointed out, QMainWindow is not a regular widget. It does not have a parent widget, therefore no layout to manage it's size and position.
If that is the case, then it should use its child layout to manage its size, no? A QMainWindow never has a parent widget, but is in need of a size-controller. Ergo it should use the first child size-controller it finds.

marcel
14th April 2007, 10:40
Of course I have laid-out my widgets. See the red line?

Yes, but you haven't cvreated a layout for the main window. Look at the ui I attached. The contents of the window stretch to fill the available space when you resize the window.



If that is the case, then it should use its child layout to manage its size, no? A QMainWindow never has a parent widget, but is in need of a size-controller. Ergo it should use the first child size-controller it finds.


Yes, use the layout of the window to set it's size. That's why setSizeConstraint worked.

Regards

jamadagni
14th April 2007, 11:01
OK thanks. I also succeeded with just removing the superfluous layoutWidget item and not adding another layout item. There already exists a layout within the layoutWidget item (which is now deleted) which I used. I also did some trimming by removing the SizePolicy items in the UI file since they are not used now.

A few final questions:


If this is the correct thing to do then why did not Designer do this itself? Is this a bug?
What is the use of the sizePolicy property of the QMainWindow, seeing as setting it to fixed does not give us anything?
Finally, I presume you did the corrections you did using a text editor and not Designer, right?

marcel
14th April 2007, 11:17
1. No, I don't believe it's a bug. Looking at the UI the way it is now, you could have done it like this from the beginning.

2. No effect at all. It's a method from QWidget and applies to a lot of other widgets.

3. No, I did the correction with Designer. Right click in the form -> Lay out -> Lay out Vertically. No text editor, and you shouldn't use one.

wysota
14th April 2007, 13:33
Maybe because the designer doesn't know the actual (runtime) contents of the widgets and this would mix things up ( could give you a wrong preview of the dialog ).
Size constraint is an attribute of a layout, not of the widget. I think it would be nice to be able to have such a property in designer just like we have margin and spacing available, but let's face it - how often do you set a size constraint on a layout?


You can always break the layout and set another one.
You can't set a new layout for a main window.


If that is the case, then it should use its child layout to manage its size, no?
No. Layout manages children, not parents. Period. What would happen if you'd wrap a widget with a layout and children into another layout? Which layout should be responsible for managing the size? Besides, you have to have something "fixed" at some point, otherwise you couldn't use size policies as any widget with "expanding" size policy would cause the top level widget to expand to screen width/height.


A QMainWindow never has a parent widget,
Why not? I used a QMainWindow as a child widget a few times...


but is in need of a size-controller. Ergo it should use the first child size-controller it finds.
The window manager is its controller as it is a child of the root window of your screen.


What is the use of the sizePolicy property of the QMainWindow, seeing as setting it to fixed does not give us anything?
Designer uses a generic way of managing properties. If you wanted to hide properties which were unusable for top-level widgets, you'd have to have a way of marking any property as such and there would be a problem if you wanted to place one form inside another as the widget which was designed as a top-level widget might in the end be a child of some other widget.


Finally, I presume you did the corrections you did using a text editor and not Designer, right?
You should never modify Designer generated files by hand.

jamadagni
15th April 2007, 01:08
You should never modify Designer generated files by hand.

Why never? I realize that it can be labeled not recommended as it is easy to muck up such a complicated XML file, but I have found it a quick way to make tiny tweaks and some cleanups that Designer won't do for me.

wysota
15th April 2007, 01:32
Why never?
Because of two reasons.
1. All changes will be overwritten next time you save the file from within Designer,
2. You have to create a real widget class anyway, so there is no point in modifying any of the generated files as you can do the same elsewhere without pushing yourself into trouble.

Ok, three reasons...
3. It's very prone to errors.


I realize that it can be labeled not recommended
If you're willing to say that aiming a gun at your head and pressing the trigger is not recommended as well, then I can agree with what you said.


but I have found it a quick way to make tiny tweaks and some cleanups that Designer won't do for me.

What kind of tweaks? I don't know if you're referring to modifying xml files saved by Designer or files generated by uic. I guess the former and I really can't see any possible reason to do that...