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

时间:2013-01-26 18:23:26

标签: qt qt4

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

我在这里缺少什么?

5 个答案:

答案 0 :(得分:7)

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

#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中)将产生不同的值。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

致电

adjustSize(); 
在提示输入某些几何属性之前

答案 3 :(得分:0)

如果QWidget是顶层窗口,那么你可以看到它周围的边框和标题栏。我们称之为框架或装饰框架,frameGeometry()返回的确是:窗口大小和位置,包括操作系统装饰。另一方面,geometry()重新调整QWidget内部矩形,可用于其他子控件或绘画。参见{{3}如果我们的窗口不是无框架或全屏......或者我们正在讨论x11下的一些无框窗口管理器.Toplevel geometry()/ frameGeometry()会有所不同。

答案 4 :(得分: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());