尽管Qt文档表明这两个函数是不同的(第一个不包含框架),但无论我选择哪个小部件 - 包括我的应用程序的主窗口 - someWidget->frameGeometry().height()
总是返回与 someWidget->geometry.height()
相同的值。
我错过了什么?
我认为你没有给小部件足够的时间来绘制。这里有一个小例子:
#include <QApplication>
#include <QMainWindow>
#include <QDebug>
class MainWindow : public QMainWindow
{
public:
MainWindow() {
startTimer(500);
}
void timerEvent(QTimerEvent *e) {
// Here values are different
qDebug() << geometry().height() << frameGeometry().height();
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
mainWin.show();
// Here values are equals
qDebug() << mainWin.geometry().height() << mainWin.frameGeometry().height();
return app.exec();
}
第一次调试输出会产生与geometry
和frameGeometry
相同的值,但第二次(在timerEvent
中)将产生不同的值。
adjustSize();
在提示某些几何属性之前
正如用户fasked所指出的,frameGeometry()
在窗口创建生命周期的早期可能不包括框架边距。我发现以下代码适用于某些情况,而调用frameGeometry()
则不适用。
QMargins frameMargins;
QWindow *window = widget->windowHandle();
if (window) {
window->create();
frameMargins = window->frameMargins();
}
QRect myFrameGeometry = widget->geometry().adjusted(
-frameMargins.left(), -frameMargins.top(),
frameMargins.right(), frameMargins.bottom());