Qt 5.7-frameGeometry()和geometry()在窗口10、全高清屏幕(1920x1080)上给出错误的值

Qt 5.7-frameGeometry()和geometry()在窗口10、全高清屏幕(1920x1080)上给出错误的值,qt,windows-10-desktop,Qt,Windows 10 Desktop,frameGeometry()和geometry()之间左上角的差值为x=8和y=31像素。虽然最后一个似乎是正确的,但8的值太高(应该是1)。 我已经编写了下面的代码片段来演示它。程序覆盖两个窗口,第二个窗口因frameGeometry()和geometry()的位置差异而移动。因此,第二个窗口的左上角应位于第一个窗口的客户区的左上角,显然不是这样,请参见所附图片 // main_test_frameGeometry.cpp #include <QApplication> #in

frameGeometry()和geometry()之间左上角的差值为x=8和y=31像素。虽然最后一个似乎是正确的,但8的值太高(应该是1)。
我已经编写了下面的代码片段来演示它。程序覆盖两个窗口,第二个窗口因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();
}
在Windows 10下,Qt假设框架厚度为8像素宽,因此为几何体().x()、框架几何体().width()和框架几何体().height()提供错误的值

frameGeometry()在show()之前和之后提供正确的位置值x()和y(),geometry() 正确的大小,因此我们构建自己的函数widgetRectangle(constqwidget*),并考虑到这一点-请参阅上面的源代码-

此函数的优点是在绘制小部件之前提供正确的值,如果您需要这些值将小部件放置在给定的位置上,这一点很有好处

Windows 10的值似乎是: frameThickness=1,titlebarThickness=30,但它们因操作系统而异

是否有查询框架厚度和标题宽度的函数

作为对库巴·奥伯的回应,以下是更多的解释和精确性

客户区域的定义如下:

我已将widget1的背景色设置为黄色。如果客户区域相对于帧位置的偏移正确,则widget1的客户区域将与第二个widget2完全重叠,并且不应显示黄色。事实并非如此

为了证明frameGeometry不正确,我在屏幕右下角放置了第三个widget3。 小部件的坐标已设置为:

x=screenwidth-frameGeometry().width();//在我的例子中,x=1919-316=1603
y=屏幕高度-frameGeometry().height();//y=1079-239=840

如果框架几何结构正确,小部件将放置在屏幕的右下角,不会留下任何空间。但是您可以清楚地看到小部件和屏幕右下角之间的一些区域

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)
QWidget*widget3=newqwidget();
widget3->setWindowTitle(“小部件3”);
widget3->调整大小(300200);
widget3->adjustSize();
widget3->move(1603840);//1603 = 1919 - 316, 840 = 1079 - 239
widget3->show();

qDebug()“应位于第一个窗口的客户区的左上角,情况显然并非如此”如果不证明客户区确实是您认为的,或者框架几何图形不正确,则无法假设“明显”部分。“应位于第一个窗口的客户区域的左上角,显然不是这样”如果不证明客户区域确实是您认为的,或者框架几何图形不正确,则无法假设“明显”部分。
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)