PDA

View Full Version : Main Window frame height



^NyAw^
9th November 2007, 17:53
Hi,

Is there anyway to get the height of the frame of the window(frame where there is the close button,...)?

Thanks,

jpn
9th November 2007, 20:26
Yes, you can:

int height = window->style()->pixelMetric(QStyle::PM_TitleBarHeight);
but may I ask what do you intend to do with it? ;)

^NyAw^
10th November 2007, 02:42
Hi,

My application has toolbars, menus and docks, and I want that the central widget use all the avaiable space. So I take the application height less toolbars,menus,docks and upper frame.

Thanks,

pherthyl
10th November 2007, 06:21
Hmm.. You shouldnt have to do that. Qt will handle the sizing for you. How are you setting up your UI?

^NyAw^
12th November 2007, 10:37
Hi,


Hmm.. You shouldnt have to do that. Qt will handle the sizing for you. How are you setting up your UI?


Could you tell me how? I reimplemented the method "resizeEvent" to resize the centralWidget to the maximum width and height. Note that if Docks are resized, the centralWidget will be resized too.

My UI is a centralWidget (the main window was done with Designer) and it has a QGridLayout that manages some windows (like OpenGL windows). So, depending on the size of the main Window and the size of the Docks, toolBars, ..., the size of the internal widget have to be resized.

Thanks,

jpn
12th November 2007, 15:01
Could you tell me how? I reimplemented the method "resizeEvent" to resize the centralWidget to the maximum width and height. Note that if Docks are resized, the centralWidget will be resized too.

My UI is a centralWidget (the main window was done with Designer) and it has a QGridLayout that manages some windows (like OpenGL windows). So, depending on the size of the main Window and the size of the Docks, toolBars, ..., the size of the internal widget have to be resized.
Hmm? But QMainWindow does that automatically (of course, provided that all the central widget, docks etc. are properly added via suitable methods in QMainWindow API). Size policies, stretch factors and such are there if you need to adjust resizing.

^NyAw^
12th November 2007, 16:00
Hi,



Size policies, stretch factors and such are there if you need to adjust resizing.


So, I have to adjust the Size policies to get it automatically be done. I am right? I will read abou it. I supose that my problem is that I always try to do it myself without thinking that maybe it is done yet(maybe I have to read a little more, but sometimes I really don't know where to find the information, Qt is great but it has a lot of classes and sometimes I don't know where to find what I want).

Thanks,

jpn
12th November 2007, 16:15
So, I have to adjust the Size policies to get it automatically be done. I am right? I will read abou it.
Well, it's hard to say exactly what do you need. But you rarely need to manage any geometries by hand. Perhaps you could provide a screenshot and then explain how do you want all the child windows to behave?

^NyAw^
12th November 2007, 16:32
Hi,

Well, the only that I need is that the centralWidget of the mainWindow occupies all tha avaiable space.

I had inserted a QSrollArea instead of the centralWidget because time ago I did'n need this behavior and the scrollBars were a good solution. Now I don't want to use scrollArea, and I want to use the maximum centralWidget size avaiable.

Thanks,

jpn
12th November 2007, 18:29
Did you apply a top level layout? Unselect child widgets, open up context menu over the background of the form and select a layout. See this thread for a screenshot: http://www.qtcentre.org/forum/f-qt-designer-3/t-layouts-to-ease-resizing-solved-9897.html

^NyAw^
12th November 2007, 19:05
Hi,



Did you apply a top level layout?


Sorry, I didn't said that I have a QGridLayout (all the code is handwritten). And I don't do it with Designer because the number of columns and rows of windows(like OpenGL widgets) can be modified.

Thanks for replies, but it works using


int height = window->style()->pixelMetric(QStyle::PM_TitleBarHeight);

as you told me.

Next time I will try to try using size policies.

Thanks,

jpn
13th November 2007, 11:06
Well, if you insist doing it wrong, I suggest you at least take a look at Window Geometry documentation (http://doc.trolltech.com/4.3/geometry.html). There is no need to query window's title height when placing its child widgets. You just have to choose proper methods which exclude window frame.

^NyAw^
13th November 2007, 11:37
Hi,

Well, or I don't explain it well or you don't understood me.
Do you really think that I'm doing it wrong? Wich is the good way? I'm not able to make sizePolicies work well (expanded and maximum don't expand the centreal widget to avaiable space).

Thanks,

wysota
13th November 2007, 11:59
If you set a widget using QMainWindow::setCentralWidget, the main window will handle resizing the widget to fit the window contents. If it doesn't happen, it means that the widget you set for the central widget doesn't have a layout applied. If you apply the layout, it will work out of the box. Consider the following code:


int main(int argc, char **argv){
QApplication app(argc, argv);
QMainWindow mw;
QWidget *w = new QWidget;
QVBoxLayout *l = new QVBoxLayout(w); // *
for(int i=0;i<5;i++){
QTextEdit *te = new QTextEdit(w);
// te->setGeometry(0, i*40, 200, 35); // %
l->addWidget(te); // *
}
mw.setCentralWidget(w);
mw.show();
return app.exec();
}

Try it and then comment out lines that are marked with asterisks and remove the comment from the line marked with the percent sign and try again, you'll see the difference while resizing.

jpn
13th November 2007, 12:02
Do you really think that I'm doing it wrong? Wich is the good way?
Unfortunately, yes I do. A good way is to rely on layouts and not to manually position children upon resize event. If you ever decide for example to change language or font, manually resized children will fail miserably. Layouts will take care of not only resize event but also a lot of other situations when geometries need to be managed.


I'm not able to make sizePolicies work well (expanded and maximum don't expand the centreal widget to avaiable space).
It's not about size policies it the layout management doesn't work at all. Size policies and stretch factors are ways to fine tune after you get layout managers properly installed and working. Either you didn't set the central widget with QMainWindow::setCentralWidget() or the central widget itself has no layout installed.

^NyAw^
13th November 2007, 12:08
Hi,

mmm...
I have a centralWidget that have a QGridLayout manager.

You know that when you resize Docks, remove or insert ToolBars, ... the space that centralWidget has is changed. Ok, so I only want that the centralWidget size is the corresponding size, not to ScrollBars apear.
Think that I have 4 OpenGL widgets and I want that have to be full visible, so them have to be resized when Docks are resized.

Thanks,

wysota
13th November 2007, 12:36
It's all doable using size policies. Child widgets should have the policy set to Maximum or Preferred and it should work. Check out the code I gave you - the text edits adjust their size according to the size of the main window's central widget. You may only get scroll bars if you use a scroll area - get rid of it and the problem might go away.

^NyAw^
13th November 2007, 13:08
Hi,



You may only get scroll bars if you use a scroll area


Thanks, this was the problem. I removed the ScrollArea and now the centralWidget is resized to the maximum avaiable space.

Thanks,

wysota
13th November 2007, 13:14
It would probably also worked if you had called setWidgetResizable(true) on the scroll area.