将QML锚点元素固定到窗口
我刚接触QML,正在努力学习如何定义一个基本的布局。我想知道怎么把一个元素固定在窗口上,这样当用户调整窗口大小时,它也会跟着变大变小。我想添加一个矩形,填满窗口里的所有空间,但我在qml文件里找不到实现的方法。我看到的所有例子都使用了固定的宽度和高度,这样的话,当窗口大小变化时,元素的大小就不会改变。
2 个回答
1
简单来说,你可以使用
Item {
anchors.fill: parent
}
这段代码,它的意思和下面这段代码是一样的:
Item {
anchors {
top: parent.top
left: parent.left
right: parent.right
bottom: parent.bottom
}
}
这里的 parent 是你想要把这个项目放进去的对象。虽然通常情况下这个 parent 是父级对象,但实际上它可以放在任何地方。
我想补充一下,通常你会给最上层的元素设置一个固定的大小,因为在默认情况下,qml 应用程序的窗口大小会跟随你主 qml 文件中的根元素的大小。如果你想做一些更复杂的事情,就需要修改生成你应用程序的 QDeclarativeView 的 C++ 代码。
3
针对你的具体问题:
- 要根据它们的父元素(兄弟元素)来锚定所有的元素。
- 确保你的顶层 QML 元素能够填满视图空间,具体方法可以参考这里。
补充一下,每当你需要进行这种大小调整时,你需要在不同的部分之间传递几何变化的信息。这里的不同部分指的是,从 QML 到 C++ 或者从 C++ 到 QML。
如何让 QML 知道顶层窗口的大小变化:
在 QML 中,顶层父元素不会自动收到关于小部件大小变化的信号,你需要手动处理。
要获取顶层小部件实际大小变化的信息,你需要实现resizeEvent函数。
每当你的实现被调用时,你需要向 QML 发送信号,告诉它发生了大小变化,因此顶层 QML 父元素也应该调整大小。
如何让 C++ 知道顶层 QML 元素的大小变化:
同样地,你的 C++ 小部件不会自动收到关于顶层 QML 元素大小变化的信号,你也需要手动处理:
- 从 C++ 侧暴露一个类给 QML。
- 每当顶层 QML 元素发生变化时,调用这个类的一个函数来通知这个变化,并请求它也调整顶层小部件的大小。