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();
第一个调试输出将为geometry
和frameGeometry
生成相同的值,但第二个(在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()的主要内容,如果未能解决你的问题,请参考以下文章