【发布时间】:2013-01-26 18:23:25
【问题描述】:
虽然Qt's docs表示这两个函数是不同的(第一个不包括框架)无论我选择什么小部件——包括我的应用程序的主窗口——someWidget->frameGeometry().height()总是返回与@987654323相同的值@。
我在这里错过了什么?
【问题讨论】:
虽然Qt's docs表示这两个函数是不同的(第一个不包括框架)无论我选择什么小部件——包括我的应用程序的主窗口——someWidget->frameGeometry().height()总是返回与@987654323相同的值@。
我在这里错过了什么?
【问题讨论】:
我认为,你没有给小部件足够的时间来绘制。有一个小例子:
#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 中)将生成不同的值。
【讨论】:
QWidget 类不能有框架。例如,QWidget 没有框架,但 QFrame 有框架。
【讨论】:
如果 QWidget 是顶级窗口,那么您可以看到它周围的边框和标题栏。我们称它为框架或装饰框架,frameGeometry() 准确地返回:窗口大小和位置,包括操作系统装饰。另一方面,geometry() 返回 QWidget 内部矩形,可用于其他子控件或绘画。请参阅http://doc.qt.io/qt-4.8/application-windows.html#window-geometry 了解更多细节。如果我们的窗口不是无框或全屏的,Toplevel geometry() / frameGeometry() 会有所不同......或者我们正在谈论 x11 下的一些无框窗口管理器。
【讨论】:
这是一篇旧帖子,但它可以帮助那些搜索相同问题的人。
打电话就行了
adjustSize();
在提示一些几何属性之前
【讨论】:
正如用户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());
【讨论】: