当 QML 项目的尺寸发生变化时如何得到通知?

Posted

技术标签:

【中文标题】当 QML 项目的尺寸发生变化时如何得到通知?【英文标题】:How to get notified when a QML item's dimensions change? 【发布时间】:2021-11-30 18:47:16 【问题描述】:

我知道我可以使用插槽 onWidthChangedonHeightChanged 来了解 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】:

作为一种解决方法,您可以创建一个绑定到widthheight 的属性,并将处理程序连接到该属性的更改信号:

property double dimensions: width * height
onDimensionsChanged: 
   if(my_item.visible)
       console.log("Dimension changed")

有一个小风险,即交换 widthheight 时数字不会改变,但在你的情况下这可能是值得的

【讨论】:

可以通过将“尺寸”更改为“宽度/高度”来减轻这种小风险。 啊,不错。感谢您指出这个小风险。尽管如此,这是一种跟踪尺寸变化的聪明方法:-)【参考方案2】:

如 cmets 中所述,默认情况下当前不存在此类信号。

您可以创建一个 sizerect 类型属性并对其做出反应:

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 通知它的所有后代?

当 RxJava 发生不同事件时如何得到通知?

当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知

Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互

当位置发生变化并且我的应用程序处于后台时,我可以获得本地通知吗?

C# wpf 如何实现自定义控件,布局时,大小发生变化,内部绘制的曲线跟随变化?