QWidget::geometry()与QWidget::frameGeometry()的区别

6

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

我错过了什么?

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

第一次调试输出会产生与geometryframeGeometry相同的值,但第二次(在timerEvent中)将产生不同的值。


感谢您的说明 - 非常有帮助。 - planarian
@Planarian 但我不知道,需要多长时间才能完全绘制出来 :( - fasked

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

但是很多QWidgets都有它们吗?例如QMdiSubWindow并没有继承QFrame。 - planarian

1
这是一篇旧帖子,但它可能会对那些寻找相同问题答案的人有所帮助。
只需调用
adjustSize(); 

在提示某些几何属性之前


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

0

正如用户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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接