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.we...@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@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 mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest