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

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

我在这里错过了什么?

【问题讨论】:

    标签: qt qt4


    【解决方案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());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-18
          • 2019-12-23
          • 2016-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多