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.we...@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 <cmaks...@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.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 >> >> > > _______________________________________________ > 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