当 QML 项目的尺寸发生变化时如何得到通知?
Posted
技术标签:
【中文标题】当 QML 项目的尺寸发生变化时如何得到通知?【英文标题】:How to get notified when a QML item's dimensions change? 【发布时间】:2021-11-30 18:47:16 【问题描述】:我知道我可以使用插槽 onWidthChanged
和 onHeightChanged
来了解 QML 项目的宽度或高度是否发生了变化。这是通过执行以下操作。
导入 QtQuick 2.12
Item
id: my_item
onWidthChanged:
if (my_item.visible)
console.log("Dimension chnaged")
onHeightChanged:
if (my_item.visible)
console.log("Dimension chnaged")
上面的效果很好。但我只想知道我的 QML 项目的尺寸是否发生了变化。当宽度或高度发生变化时,我只需要一个回调。我不需要两者的回调。 是否有 QML 信号仅用于监听尺寸变化?
我使用的是Qt 5.15.7商业版。
【问题讨论】:
不存在这样的信号。有一个建议为几何添加一个,但这将包括 x 和 y:bugreports.qt.io/browse/QTBUG-83050 感谢您的告知。 【参考方案1】:作为一种解决方法,您可以创建一个绑定到width
和height
的属性,并将处理程序连接到该属性的更改信号:
property double dimensions: width * height
onDimensionsChanged:
if(my_item.visible)
console.log("Dimension changed")
有一个小风险,即交换 width
和 height
时数字不会改变,但在你的情况下这可能是值得的
【讨论】:
可以通过将“尺寸”更改为“宽度/高度”来减轻这种小风险。 啊,不错。感谢您指出这个小风险。尽管如此,这是一种跟踪尺寸变化的聪明方法:-)【参考方案2】:如 cmets 中所述,默认情况下当前不存在此类信号。
您可以创建一个 size
或 rect
类型属性并对其做出反应:
property size dimensions: Qt.size(width, height)
onDimensionsChanged: console.log("Dimension changed")
这是一个为发射器供电的 WASM 示例:
https://www.canonic.com/#https://playground.canonic.com/525f6691-fe05-4824-a7f1-574bb8cabd8b/dimension-changed-signal-example
【讨论】:
以上是关于当 QML 项目的尺寸发生变化时如何得到通知?的主要内容,如果未能解决你的问题,请参考以下文章
当排列视图的大小发生变化时,如何确保 UIStackView 通知它的所有后代?
当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知
Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互