如何解决由qml中的属性更改引起的循环调用,我可以在某处停止绑定吗?

问题描述 投票:0回答:1
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    property int anum: 0
    property int bnum: 1

    onAnumChanged: {
        bnum+=1
    }

    onBnumChanged: {
        anum+=1
        //Is there some way to stop loop call ?
        //in widget we can unconnect some signal and slot
        //but how to disconnect in qml
    }

    Button{
        text:"begain"
        onClicked: {
            anum=anum+1
        }
    }

}
  1. 当我按下按钮时
  2. “anum”更改为 1
  3. 然后函数onAnumChanged开始执行
  4. 然后bnum已经改变了
  5. 然后onBnumChanged开始执行
  6. 那么 anum 已经改变了
  7. 然后从3循环到7

有什么方法可以阻止这个吗?我可以使用一些解除绑定函数来阻止这个,比如c++(小部件)中的“断开(发送者,信号,接收者,插槽)”

qml nested-loops inotifypropertychanged function-call
1个回答
0
投票

需要一些东西来帮助打破绑定循环:

  1. 按照 smr 的建议检查中断标志
  2. 允许事件,使用 Qt.callLater() 意味着授予空闲时间,以便事件可以触发
  3. 定义重置和设置中断标志的事件

我们可以借用用户中断模式并通过鼠标点击、按键甚至可见性更改来实现,这些都会引发用户中断。

import QtQuick
import QtQuick.Controls
Page {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    property int anum: 0
    property int bnum: 1
    property bool userbreak: false

    onAnumChanged: {
        if (userbreak) return;
        Qt.callLater( () => { bnum++ } );
    }

    onBnumChanged: {
        if (userbreak) return;
        Qt.callLater( () => { anum++ } );
        //Is there some way to stop loop call ?
        //in widget we can unconnect some signal and slot
        //but how to disconnect in qml
    }

    Button{
        text: "begain %1 %2".arg(anum).arg(bnum)
        onClicked: {
            userbreak = false;
            Qt.callLater( () => { anum++ } );
        }
    }

    TapHandler {
        onTapped: userbreak = true;
    }

    Keys.onPressed: {
        userbreak = true;
    }

    onVisibleChanged: {
        userbreak = true;
    }
}

您可以在线尝试!

© www.soinside.com 2019 - 2024. All rights reserved.