QWidget::geometry() 与 QWidget::frameGeometry()

Posted

技术标签:

【中文标题】QWidget::geometry() 与 QWidget::frameGeometry()【英文标题】:QWidget::geometry() vs. QWidget::frameGeometry() 【发布时间】:2013-01-26 18:23:25 【问题描述】:

虽然Qt's docs表示这两个函数是不同的(第一个不包括框架)无论我选择什么小部件——包括我的应用程序的主窗口——someWidget->frameGeometry().height()总是返回与@987654323相同的值@。

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

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

#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 但我不知道,确切需要多长时间才能完全绘制 :(【参考方案2】:

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

【讨论】:

但是不是很多 QWidgets 都有吗?例如,QMdiSubWindow 不继承 QFrame【参考方案3】:

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

【讨论】:

【参考方案4】:

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

打电话就行了

adjustSize(); 

在提示一些几何属性之前

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于QWidget::geometry() 与 QWidget::frameGeometry()的主要内容,如果未能解决你的问题,请参考以下文章

pcl-qt使用QVTKWidget 与PCLVisualizer 显示雷达点云

用QtWebKit开发简单的浏览器

pyqt5学习4

从 PyQt 中的 QPushButton 获取文本

PyQt5 弹出窗口

使用QT定时器 隐藏 label