虽然Qt's docs表示这两个函数不同(第一个不包括框架),无论我选择哪个小部件 - 包括我的应用程序的主窗口 - someWidget->frameGeometry().height()
总是返回相同的值为someWidget->geometry.height()
。
我在这里缺少什么?
答案 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();
}
第一个调试输出将为geometry
和frameGeometry
生成相同的值,但第二个(在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());