[Interest] QMdiSubWindow resize() does include the frame

Constantin Makshin cmakshin at gmail.com
Thu Apr 25 19:57:55 CEST 2013


I admit that if a widget looks like a top-level window, one would expect to
see it working [mostly] as a top-level window.

But at the same time I think it's too late to change the current behavior
as it may break some existing code (technically QMdiSubWindow-s are just
child widgets, the fact that distinction between client area and frame is
specific to top-level windows is a documented design choice, so IMHO it's
OK to rely on the way things work now).
On Apr 25, 2013 2:58 PM, "Immanuel Weber" <immanuel.weber at gmail.com> wrote:

> Well, I do understand that this is technically correct and not a bug in
> that sense, but I think this is not really convenient. I think the idea of
> seperating size()/resize() and frameSize() etc. is to conveniently work
> with widgets which have a frame, title etc. and hence that the use of it
> should not depend on the fact that a widget is a real top-level-widget or
> not, rather than on wether it has a frame or not.
> That would be more Qt-ish, I think...
> Any thoughts?
>
>
> 2013/4/25 Constantin Makshin <cmakshin at gmail.com>
>
>> This is not a bug -- as both John and Qt documentation say, the
>> frame-client area distinction applies only to top-level widgets/windows
>> (quote from the page you gave link to: "Note that the distinction only
>> matters for decorated top-level widgets. For all child widgets, the frame
>> geometry is equal to the widget's client geometry."). And since
>> QMdiSubWindow is not a top-level window, the behavior you describe is
>> correct.
>>  On Apr 24, 2013 11:28 PM, "Immanuel Weber" <immanuel.weber at gmail.com>
>> wrote:
>>
>>> Thanks John for the code. It works fine. I'm not really into the qt
>>> internals, I don't know if it is enough to overload in QMdiSubWindow size()
>>> and resize() to account for your code snippets. Should this be reported as
>>> a bug?
>>>
>>> Am Mittwoch, 24. April 2013 um 17:49 schrieb John Weeks:
>>>
>>> OK- this time I got the correct message sent to the correct address.
>>> Sorry about that whole series of mistakes. I gotta say, I really disagree
>>> with the general notion that putting the list as the Reply To: is a bad
>>> thing...
>>>
>>>
>>>
>>>
>>> Yep- I got caught by this one, too. The explanation is that a
>>> QMdiSubWindow isn't actually a window, it's a child widget of the QMdiArea
>>> that contains it. Consequently, what looks like a window title bar is
>>> actually a child widget drawn by Qt. As such, the whole "window" is the
>>> QMdiSubWindow.
>>>
>>> That doesn't really help, does it?
>>>
>>> Here's my code to get the titlebar height in order to correct it:
>>>
>>> ----------------------------
>>>   if ( (myWidget()->windowFlags() & Qt::FramelessWindowHint) != 0)
>>>  return 0;
>>>
>>> QStyle * wStyle = myWidget()->style();
>>> QStyleOptionTitleBar so;
>>>  so.titleBarState = 1; // kThemeStateActive
>>> so.titleBarFlags = Qt::Window;
>>>
>>>  // it seems that pixelMetric includes the frame in the titlebar height.
>>>
>>> int titleBarHeight = wStyle->pixelMetric(QStyle::PM_TitleBarHeight, &so, myWidget());
>>> #ifdef MACIGOR
>>> titleBarHeight -= 4; // pixelMetric adds 4 pixels for some unknown
>>> reason.
>>> #endif
>>>
>>> return titleBarHeight;
>>> ----------------------------
>>>
>>> You will also need the frame width:
>>>
>>> ----------------------------
>>>   if ( (myWidget()->windowFlags() & Qt::FramelessWindowHint) != 0)
>>>  return 0;
>>>
>>> QStyle * wStyle = myWidget()->style();
>>> QStyleOptionTitleBar so;
>>>  so.titleBarState = 1; // kThemeStateActive
>>> so.titleBarFlags = Qt::Window;
>>>
>>>
>>> return wStyle->pixelMetric(QStyle::PM_MdiSubWindowFrameWidth , &so, myWidget());
>>> ----------------------------
>>>
>>>
>>> If anyone sees a problem with this, I'd be interested in hearing about
>>> it. So far it seems to work, at least on Macintosh and Windows.
>>>
>>> -John Weeks
>>>
>>>
>>> On 23-Apr-2013, at 1:22 PM, Immanuel Weber wrote:
>>>
>>>  Hi all,
>>>
>>> I'm trying to set the inner area of a QMdiSubArea to a specific size,
>>> but the the resize(..) member of QMdiSubArea includes the frame. As stated
>>> in the documentation (
>>> http://qt-project.org/doc/qt-5.0/qtwidgets/application-windows.html#window-geometry)
>>> resize(..) (belonging to size()) should exclude the frame and set the size
>>> of the inner area, but it sets the size of the complete sub window.
>>> Matching that, size() returns the same frame-including-value as frameSize()
>>> does. I know that there are (non-beautiful/simple) ways to do that, by
>>> determining the border width of a sub window, but I'm just curious why we
>>> have such an inconsitency here.
>>> I add a minimal example, where you can see the normal behavior and the
>>> one of the sub window.
>>> In addition there is a commented resize command, which produces
>>> (uncommented) on my machines another strange behavior: the window is moved
>>> to the top left corner of the screen, so that the header bar of the window
>>> lies outside of it.
>>>
>>> #include <QApplication>
>>> #include <QtWidgets/QtWidgets>
>>> #include <QDebug>
>>>
>>>
>>> int main(int argc, char *argv[])
>>> {
>>>     QApplication a(argc, argv);
>>>     QPushButton * button = new QPushButton("button");
>>>     QMdiArea area;
>>>     QMdiSubWindow * sub = area.addSubWindow(button);
>>>     area.show();
>>>     qDebug() << "strange: "<<  sub->size() << sub->frameSize();
>>>     qDebug() << "expected: " << area.size() << area.frameSize();
>>>
>>> //    area.resize(500, 500);
>>>
>>>     return a.exec();
>>> }
>>>
>>> (all on Win7 x64 with a Qt 5.0.1/.2 x86 MSVC release)
>>>
>>> Any ideas on that?
>>> Greetings
>>> Immanuel
>>>
>>>
>>>
>>>  _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>
>>>
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>
>>>
>>>
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>
>>>
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>>
>>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130425/62a7a31a/attachment.html>


More information about the Interest mailing list