是否可以获得 QQuickItem 布局更改事件?

Posted

技术标签:

【中文标题】是否可以获得 QQuickItem 布局更改事件?【英文标题】:Is it possible to get QQuickItem layout change event? 【发布时间】:2018-05-15 11:43:10 【问题描述】:

QQuickItem 布局可以改变吗?

有没有办法在布局/大小(x、y、宽度或高度)改变时触发函数?

有办法连接每个属性信号变化,但这不是正确的方法。

已经尝试过 windowChanged 信号,但它不起作用。

我想要做的是每次我的 QQuickItem 布局/大小(其中任何一个)更改时调用提供 x(GLOBAL),y(GLOBAL),width,height 的外部 java 函数。

编辑: 渲染完成后我需要知道几何图形。所以我不能单独连接到每个属性。

【问题讨论】:

看看这个,也许它有帮助 is-there-a-window-resize-event-signal 它可能有助于这个功能:void QQuickItem::windowChanged(QQuickWindow *window) #windowChanged 我从来没有用过它,所以我不知道有什么行为,但从我搜索的内容来看好的,在调整项目大小时发送信号。 @Skywrath 谢谢,试过那个,但我从来没有收到那个信号。 嗯,然后尝试将 QQuickItem 放入容器并检查父级的调整大小?或者另一个坏主意:制作一个接受宽度和高度的函数,并在每次执行操作时调用它(按下按钮或您知道它会改变大小的东西),如果您的函数返回的结果与原始结果不同,触发调整大小时做你想做的事。 xD C++ QQuickItem: How to trigger a function on item size change的可能重复 @derM 我有别的想法,但他编辑了帖子,所以我的解决方案现在没用了 xD 【参考方案1】:

将每个属性连接到一个函数,该函数检查“几何”与某些已保存变量的比较,如果不匹配,则发出一个新信号

Item 
   id: myItem
   onXChanged:  myItem.checkGeometry() 
   onYChanged:  myItem.checkGeometry() 
   onWidthChanged:  myItem.checkGeometry() 
   /* etc etc */

   signal: geometryChanged(var _x, var _y, var _width, var _height)

   property var  oldGeometry: [ myItem.x, myItem.y, myItem.width, myItem.height]
   function checkGeometry()  
     var geometryToCheck = [mapToGlobal(myItem.x), mapToGlobal(myItem.y), myItem.width, myItem.height];
     for (var i=0; i<oldGeometry.length; i++) 
          if (oldGeometry[i] !== geometryToCheck[i]) 
               myItem.geometryChanged(mapToGlobal(myItem.x), mapToGlobal(myItem.y), myItem.width, myItem.height);
               myItem.oldGeometry = geometryToCheck;
               break;
          
     
    

【讨论】:

这是我试图避免的。但看起来这只是解决方案。

以上是关于是否可以获得 QQuickItem 布局更改事件?的主要内容,如果未能解决你的问题,请参考以下文章

MouseArea 窃取 QQuickItem 的鼠标事件

C++ QQuickItem:如何在项目大小更改时触发函数

更改点击事件的网格布局

如何在 IOS 中的联系人更改事件中获得通知? [复制]

DOM 元素布局更改事件

将背景图像添加到 QQuickItem