frameGeometry()和geometry()之间左上角的差异是x = 8和y = 31像素。虽然最后一个似乎是正确的,但8的值太高(应该是一个)。 我已经编写了下面的代码片段来演示它。程序覆盖2个窗口,第二个窗口移动了frameGeometry()和geometry()的位置差异。所以第二个窗口的左上角应该位于第一个窗口的客户区左上角,显然不是这种情况,见附图。
// main_test_frameGeometry.cpp
#include <QApplication>
#include <QtWidgets>
// values for Windows 10
const int frameThickness = 1
const int titlebarThickness = 30;
QRect widgetRectangle( const QWidget& widget) // Ersatz for frameGeometry(). Gives right values *before* and after widget has been drawn
{
return QRect(widget.frameGeometry().x(), widget.frameGeometry().y(), widget.width()+2*frameThickness, widget.height()+titlebarThickness+2*frameThickness);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* widget1 = new QWidget();
widget1->setWindowTitle("widget 1");
widget1->resize(300, 200);
qDebug() << "widget1 geometry:" << widget1->geometry() << " | frameGeometry :" << widget1->frameGeometry() << " | widgetRectangle:" << widgetRectangle( *widget1 );
widget1->move(100, 100);
qDebug() << "widget1 - after move(100,100) geometry:" << widget1->geometry() << "| frameGeometry :" << widget1->frameGeometry() << "| widgetRectangle:" << widgetRectangle( *widget1 );
widget1->show();
qDebug() << "widget1 - after move(100,100) & show() geometry:" << widget1->geometry() << "| frameGeometry :" << widget1->frameGeometry() << "| widgetRectangle:" << widgetRectangle( *widget1 );
QWidget* widget2 = new QWidget();
widget2->setWindowTitle("widget 2");
widget2->resize(300, 200);
widget2->adjustSize();
widget2->move(108, 131);
widget2->show();
qDebug() << "widget2 - after move(108,131) & show() geometry:" << widget1->geometry() << "| frameGeometry :" << widget1->frameGeometry() << "| widgetRectangle:" << widgetRectangle( *widget2 );
qDebug() << "\nunder Windows 10 Qt is assuming that frameThickness is 8 pixel and so give wrong values \nfor geometry().x(), framegeometry().width()and frameGeometry().height()!";
qDebug() << "\nframeGeometry() gives before and after show() the right position values x() and y(), geometry() \nthe right size, so we build our own function widgetRectangle() taking this into account!";
return app.exec();
}
相应的打印输出是:
widget1 geometry: QRect(0,0 300x200) | frameGeometry : QRect(0,0 300x200) | widgetRectangle: QRect(0,0 302x232)
widget1 - after move(100,100) geometry: QRect(100,100 300x200) | frameGeometry : QRect(100,100 300x200) | widgetRectangle: QRect(100,100 302x232)
widget1 - after move(100,100) & show() geometry: QRect(108,131 300x200) | frameGeometry : QRect(100,100 316x239) | widgetRectangle: QRect(100,100 302x232)
widget2 - after move(108,131) & show() geometry: QRect(108,131 300x200) | frameGeometry : QRect(100,100 316x239) | widgetRectangle: QRect(108,131 302x232)
Windows 10下的假设frameThickness为8像素宽,因此给geometry()。x(),framegeometry()。width()和frameGeometry()。height()!
提供了错误的值。frameGeometry()在show()之前和之后给出正确的位置值x()和y(),geometry() 正确的大小,所以我们构建我们自己的函数widgetRectangle(const QWidget *)考虑到这一点 - 参见上面的源代码 -
此功能的优点是在绘制窗口小部件之前提供正确的值,如果您需要将窗口小部件放置在给定位置的值,这将是有利的。
Windows 10的值似乎是: frameThickness = 1,titlebarThickness = 30,但这些因操作系统而异。
是否有查询frameThickness和titlebarThickness的函数?
回应Kuba Ober,做了一些更多的解释和准备。
客户区是什么,在此处定义: http://doc.qt.io/qt-5/application-windows.html#window-geometry
我已将widget1的背景颜色设置为黄色。在客户区域相对于帧位置的偏移将是正确的情况下,窗口小部件1的客户区域将完全与第二窗口小部件2重叠,并且不应该看到黄色。事实并非如此。
为了证明frameGeometry不正确,我在屏幕的右下角放置了第三个widget3。 窗口小部件的坐标已设置为:
x = screenwidth - frameGeometry()。width(); //在我的情况下x = 1919 - 316 = 1603
y = screenheight - frameGeometry()。height(); // y = 1079 - 239 = 840
如果frameGeometry正确,则窗口小部件将放置在屏幕的右下角,并且不会留下任何空间。但是你可以清楚地看到小部件和屏幕右下角之间的某个区域!
widget3的源代码是:
QWidget* widget3 = new QWidget();
widget3->setWindowTitle("widget 3");
widget3->resize(300, 200);
widget3->adjustSize();
widget3->move(1603, 840); // 1603 = 1919 - 316, 840 = 1079 - 239
widget3->show();
qDebug() << "\nwidget3 - after move(1603,840) & show() geometry:" << widget3->geometry() << "| frameGeometry :" << widget3->frameGeometry() << "| widgetRectangle:" << widgetRectangle( *widget3 );
//widget3 - after move(1603,840) & show() geometry: QRect(1611,871 300x200) | frameGeometry : QRect(1603,840 316x239) | widgetRectangle: QRect(1603,840 300x232)