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