尽管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
and产生相同的值frameGeometry
,但第二个 (in timerEvent
) 将产生不同的值。
QWidget 类不能有框架。例如,QWidget 没有框架,但 QFrame 有框架。
如果 QWidget 是顶级窗口,那么您可以看到它周围的边框和标题栏。我们称之为框架或装饰框架,frameGeometry() 准确地返回:窗口大小和位置,包括操作系统装饰。另一方面,geometry() 返回 QWidget 内部矩形,可用于其他子控件或绘画。参见http:// doc.qt.io/qt-4.8/application-windows.html#window-geometry了解更多详细信息。如果我们的窗口不是无框或全屏的,Toplevel geometry() / frameGeometry() 会有所不同......或者我们正在谈论一些无框x11下的窗口管理器。
这是一篇旧帖子,但这可以帮助那些寻找相同问题的人。
打电话
adjustSize();
在提示一些几何属性之前
正如用户伪造的注释,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());