Re: [Interest] geometry() for a widget that hasn't been shown
Thanks, André. I had considered that but was having trouble with the retching feeling in my stomach. I may just do that after taking some dramamine! -John Weeks WaveMetrics, Inc. > On Sep 23, 2015, at 1:00 AM, André Somers wrote: > > In the past, I have resorted to first showing the window off-screen, > getting its measurements, do my thing, and only then move it to the > visible area of the screen. It works, but it is a drag. In my case it > was needed in order to make a dialog that nicely resizes using an > animation when different options are selected. > ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] geometry() for a widget that hasn't been shown
Op 21-9-2015 om 19:33 schreef John Weeks: > If this is a repeat, my apologies. I can't tell if I saw this arrive on the > list! > > > > In general a QWidget that hasn't been made visible yet gives bogus results > for QWidget::geometry(). Qt only guarantees that a call to setGeometry() will > result in a Resize event when the window is made visible. But we often need > to ask a window or child widget how big it is before it is made visible in > order to do various kinds of calculations. These calculations are sometimes > used for things that preclude waiting for the window to become visible. > > Is there a way to force the Resize events (and all the layout calculation > machinery that goes with it) before it is visible? Using Qt 5.5, I see that > if you call QWidget::grab(), it will call a static function > sendResizeEvents() that does exactly what I want: > > QPixmap QWidget::grab(const QRect &rectangle) > { > Q_D(QWidget); > if (testAttribute(Qt::WA_PendingResizeEvent) || > !testAttribute(Qt::WA_WState_Created)) > sendResizeEvents(this); > > Is there some other way to get this to happen? I suppose I could just call > grab() and throw away the QPixmap, but that seems like an awful kludge... > In the past, I have resorted to first showing the window off-screen, getting its measurements, do my thing, and only then move it to the visible area of the screen. It works, but it is a drag. In my case it was needed in order to make a dialog that nicely resizes using an animation when different options are selected. André ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] geometry() for a widget that hasn't been shown
Thanks, Jan. I thought the same thing, but it didn't help. I even called EnsurePolished() first, having seen such things in the Qt source. But it appears that adjustSize() adjusts child widgets for the current window geometry, and doesn't try to determine an accurate window geometry first. The fundamental problem is that Qt puts off creating the native window representation (NSWindow or NSView or HWND, etc.) until it is first shown. So until then, there is nothing to measure. But it does seem as though the cached geometry could be used to return an accurate value. I guess its JIRA bug time... -John Weeks > On Sep 22, 2015, at 4:31 AM, Jan Dasselaar wrote: > > Maybe the QWidget::adjustSize() function is what you are looking for. > I think after calling adjustSize() the geometry() function should give a > up to date result. ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] geometry() for a widget that hasn't been shown
Hello John, Maybe the QWidget::adjustSize() function is what you are looking for. I think after calling adjustSize() the geometry() function should give a up to date result. Hth, Jan On 21-9-2015 19:33, John Weeks wrote: > If this is a repeat, my apologies. I can't tell if I saw this arrive on the > list! > > > > In general a QWidget that hasn't been made visible yet gives bogus results > for QWidget::geometry(). Qt only guarantees that a call to setGeometry() will > result in a Resize event when the window is made visible. But we often need > to ask a window or child widget how big it is before it is made visible in > order to do various kinds of calculations. These calculations are sometimes > used for things that preclude waiting for the window to become visible. > > Is there a way to force the Resize events (and all the layout calculation > machinery that goes with it) before it is visible? Using Qt 5.5, I see that > if you call QWidget::grab(), it will call a static function > sendResizeEvents() that does exactly what I want: > > QPixmap QWidget::grab(const QRect &rectangle) > { > Q_D(QWidget); > if (testAttribute(Qt::WA_PendingResizeEvent) || > !testAttribute(Qt::WA_WState_Created)) > sendResizeEvents(this); > > Is there some other way to get this to happen? I suppose I could just call > grab() and throw away the QPixmap, but that seems like an awful kludge... > > -John Weeks > > ___ > Interest mailing list > Interest@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest > ___ > Interest mailing list > Interest@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest > ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
[Interest] geometry() for a widget that hasn't been shown
If this is a repeat, my apologies. I can't tell if I saw this arrive on the list! In general a QWidget that hasn't been made visible yet gives bogus results for QWidget::geometry(). Qt only guarantees that a call to setGeometry() will result in a Resize event when the window is made visible. But we often need to ask a window or child widget how big it is before it is made visible in order to do various kinds of calculations. These calculations are sometimes used for things that preclude waiting for the window to become visible. Is there a way to force the Resize events (and all the layout calculation machinery that goes with it) before it is visible? Using Qt 5.5, I see that if you call QWidget::grab(), it will call a static function sendResizeEvents() that does exactly what I want: QPixmap QWidget::grab(const QRect &rectangle) { Q_D(QWidget); if (testAttribute(Qt::WA_PendingResizeEvent) || !testAttribute(Qt::WA_WState_Created)) sendResizeEvents(this); Is there some other way to get this to happen? I suppose I could just call grab() and throw away the QPixmap, but that seems like an awful kludge... -John Weeks ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
[Interest] geometry() for a widget that hasn't been shown
In general a QWidget that hasn't been made visible yet gives bogus results for QWidget::geometry(). Qt only guarantees that a call to setGeometry() will result in a Resize event when the window is made visible. But we often need to ask a window or child widget how big it is before it is made visible in order to do various kinds of calculations. These calculations are sometimes used for things that preclude waiting for the window to become visible. Is there a way to force the Resize events (and all the layout calculation machinery that goes with it) before it is visible? Using Qt 5.5, I see that if you call QWidget::grab(), it will call a static function sendResizeEvents() that does exactly what I want: QPixmap QWidget::grab(const QRect &rectangle) { Q_D(QWidget); if (testAttribute(Qt::WA_PendingResizeEvent) || !testAttribute(Qt::WA_WState_Created)) sendResizeEvents(this); Is there some other way to get this to happen? I suppose I could just call grab() and throw away the QPixmap, but that seems like an awful kludge... -John Weeks ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest