5

尽管Qt 的文档表明这两个函数是不同的(第一个函数不包括框架),但无论我选择什么小部件——包括我的应用程序的主窗口——someWidget->frameGeometry().height()总是返回与someWidget->geometry.height().

我在这里想念什么?

4

5 回答 5

8

我认为,您没有给小部件足够的时间来绘制小部件。有一个小例子:

#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();
}

第一个调试输出将为geometryand产生相同的值frameGeometry,但第二个 (in timerEvent) 将产生不同的值。

于 2013-01-26T18:42:24.130 回答
1

QWidget 类不能有框架。例如,QWidget 没有框架,但 QFrame 有框架。

于 2013-01-26T18:41:22.473 回答
1

如果 QWidget 是顶级窗口,那么您可以看到它周围的边框和标题栏。我们称之为框架或装饰框架,frameGeometry() 准确地返回:窗口大小和位置,包括操作系统装饰。另一方面,geometry() 返回 QWidget 内部矩形,可用于其他子控件或绘画。参见http:// doc.qt.io/qt-4.8/application-windows.html#window-geometry了解更多详细信息。如果我们的窗口不是无框或全屏的,Toplevel geometry() / frameGeometry() 会有所不同......或者我们正在谈论一些无框x11下的窗口管理器。

于 2016-03-11T18:55:06.463 回答
1

这是一篇旧帖子,但这可以帮助那些寻找相同问题的人。

打电话

adjustSize(); 

在提示一些几何属性之前

于 2017-03-28T14:59:55.237 回答
0

正如用户伪造的注释,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());
于 2021-03-24T06:23:05.653 回答