October 17, 2010

DimanNe DimanNe
Lab Rat
21 posts

Widget’s geometry before first show

Page  
1

Suppose I have QStackedLayout, and some Widgets in it.
How can I know geometry (real, not QRect(0,0 640×480)) of given widget before first call QStackedLayout::setCurrentWidget(widget)?

19 replies

October 18, 2010

Deleted Member # 4a2 Deleted Member # 4a2
Ant Farmer
1481 posts

looks like no APIs to make such a call. what is your use case? why isn’t QRect() enough?

October 18, 2010

DimanNe DimanNe
Lab Rat
21 posts

So, I has several widgets in QStackedLayout. All these widgets are hidden when programme starts. But on button click I want to start animation, in which corresponding widget’s geometry() will be changed from button’s geometry() to geometry of this widget, when it is shown (and at end of the animation call widget->show()). So, I must know its geometry before first show…
I think, it can be made by placing (and showing) empty dummy widget, before animation…

October 18, 2010

Deleted Member # 4a2 Deleted Member # 4a2
Ant Farmer
1481 posts

You might not need dummy widgets. Have you seen the animation framework examples? You can play with QPropertyAnimation and animate the position, size, rotate and opacity properties and make the transitions look how you want.

And yes, you can add the widget itself to the layout and obtain the size before the show. the property animation can then take initial value from the button’s size and end value will be the widget’s size. You can also animate opacity from 0 to 1, so the widget will be hidden first and then fully appear at the end of the animation

October 18, 2010

DimanNe DimanNe
Lab Rat
21 posts

You might not need dummy widgets. Have you seen the animation framework examples? You can play with QPropertyAnimation and animate the position, size, rotate and opacity properties and make the transitions look how you want.

Yes, of course, I know about QPropertyAnimation, and I use it.
But I apply it to painter (scale/translate) on which widget draws itself (by widget->render(&p)). I think that I can not apply QPropertyAnimation directly to my widget because it is quite complex and it will look ugly when it will have small sizes during animation. Furthermore, I want to get something looking like KDE animation, while minimizing windows.

And yes, you can add the widget itself to the layout and obtain the size before the show.

No, I can not… Yes, I can, but this size (before first show) is not correct – always equals to QRect(0, 0, 640×480)

October 18, 2010

Deleted Member # 4a2 Deleted Member # 4a2
Ant Farmer
1481 posts

You mean, before show() if you use something like

  1. widget->setGeometry(QRect(30,30,200,200);

it will still show QRect(0,0,640×480) ?

can you check again and confirm?

October 18, 2010

DimanNe DimanNe
Lab Rat
21 posts

No, after this

  1. widget->setGeometry(QRect(30,30,200,200);

geometry will become QRect(30,30,200,200)

But where/how can I know proper values?

Furthermore,
“will still show QRect(0,0,640×480) or not after widget->setGeometry(X);” – is NOT the question.
Qustions is how to find correct X.

October 18, 2010

Deleted Member # 4a2 Deleted Member # 4a2
Ant Farmer
1481 posts

can you upload your test file, can chk further

October 18, 2010

DimanNe DimanNe
Lab Rat
21 posts

Test code here
http://pastebin.com/biVYTMvr [pastebin.com]

Output is:

MainWindow::showEvent: Geometry of second button before show QRect(0,0 640×480)
MainWindow::on_Timer_timeout(): Geometry of second button after show QRect(0,0 200×100)

October 18, 2010

danilocesar danilocesar
Lab Rat
161 posts

Usually, layouts try to respect preferredSize() values, however I’m not used to QStackLayout.

I’m remember when I was working with GraphicsLayout that there is no way to know the internal elements sizes before layout’s invalidade [doc.trolltech.com] and activate [doc.trolltech.com]

The elements still needs to be rearranged.

 Signature 

Danilo Cesar Lemes de Paula
Software Engineer

October 18, 2010

Deleted Member # 4a2 Deleted Member # 4a2
Ant Farmer
1481 posts

As soon as you create the widget, why not use

  1. Stack->widget(1)->setFixedSize(200,100);

or to any other custom size?

October 18, 2010

DimanNe DimanNe
Lab Rat
21 posts

or to any other custom size?

What is the custom size?
I do not know PROPER (correct) size. PROPER size = size of widget, when it fits its parent widget (Stack in the example)

Of course, I can calculate (how it does Qt layout system) it by myself, but then I must write half of Qt layout system), to take into account indents, different platforms and so on…

October 19, 2010

Deleted Member # 4a2 Deleted Member # 4a2
Ant Farmer
1481 posts

you are right, calculating the sizes though possible will be a tall order. In your case, you want to animate only on click of a button, at which points I assume all the widgets will be created, laid out in the layout, so will be sized properly.

That corresponds to the following in your test code …

  1. void MainWindow::on_Timer_timeout()
  2.    {
  3.       qDebug() << "MainWindow::on_Timer_timeout(): Geometry of second button before animation" << Stack->currentWidget()->geometry();
  4.  
  5.       // At this point all widgets are laid out and sized properly, but the widget is still not shown
  6.       // You can set the initial size and target size.
  7.  
  8.       Stack->setCurrentIndex(1);
  9.       // widget is shown now with initial size... and you can animate at this point?
  10.  
  11.       qDebug() << "MainWindow::on_Timer_timeout(): Geometry of second button after show" << Stack->currentWidget()->geometry();
  12.    }

October 19, 2010

DimanNe DimanNe
Lab Rat
21 posts

you want to animate only on click of a button,

Yes

at which points I assume all the widgets will be created,

Yes

laid out in the layout,

Yes

so will be sized properly.

No… They all added to QStackedLayout, but not shown. Only one (first of them) shown when app has started. And only after they all are shown though one time, they will have proper size. But at start, only on of them is shown…

Since they all has the same size, I think, I can use proper size of this first shown widget.

October 19, 2010

stuk stuk
Ant Farmer
540 posts

QStackedWidget provides a stack of widgets where only one widget is visible at a time.
So i think the geometry of all widget if is not specific, it will be the geometry of the QStackedWidget.

size of

  1. QStackedWidget->widget(0)->geometry();
  2. QStackedWidget->widget(1)->geometry();

after use

  1. QStackedWidget->setCurrentIndex(number);

is

  1. QStackedWidget->geometry();

But i not understand if this is useful for you or not :)

October 19, 2010

DimanNe DimanNe
Lab Rat
21 posts

This
widget(0)->geometry();
and this
QStackedWidget->geometry();

almost equal – differs 2-3pixels.

But best solution, imho, is

Since they all has the same size, I think, I can use proper size of this first shown widget.

Page  
1

  ‹‹ Product keys / trial      Require administrator privileges ››

You must log in to post a reply. Not a member yet? Register here!