2013-10-17 55 views
0

我很努力去理解QML状态概念。QML状态不会在C++信号上发生变化

我有以下代码:

import QtQuick 2.1 
import QtQuick.Controls 1.0 

Rectangle{ 
    id: myRectangle 
    width: 500 
    height: 120 

    state: "init" 

    Button { 

     id: myBtn1 
     text: "hello" 
     anchors.right: parent.right 
     anchors.rightMargin: 40 
     anchors.verticalCenter: parent.verticalCenter 
     onClicked: { 
      console.log("trying to change state to myState " 
      myRectangle.state = "customState" 
     } 
    } 
    Button { 
     id: myBtn2 
     text: "bye" 
     anchors.right: parent.right 
     anchors.rightMargin: 40 
     anchors.verticalCenter: parent.verticalCenter 
     onClicked: { 
      myCppObject.coolFunction() 
     } 
     visible: false 
    } 

    Connections { 
     target: myCppObject 
     onCoolSignal: { 
      console.log("signal triggered") 
      console.log("state before signal: " + myRectangle.state); 

      myRectangle.state = "init"; 

      console.log("state after signal: " + myRectangle.state); 
     } 

    } 

    states: [ 
      State { 
       name: "init" 
       PropertyChanges { 
        target: myBtn1 
        visible:true 
       } 
       PropertyChanges { 
        target: myBtn2 
        visible: false 
       } 
      }, 
      State { 
       name: "customState" 
       PropertyChanges { 
        target: myBtn1 
        visible: false 
       } 
       PropertyChanges { 
        target: myBtn2 
        visible: true 
       } 
      } 
    ] 
} 

我的意图是,在点击“myBtn1”这个按钮应该会消失,“myBtn2”应该显示。因此,我使用所描述的状态,到目前为止它工作!状态改变并且标签“bye”的按钮可见。

在接下来的步骤中,点击按钮“myBtn2”调用“myCppObject”的函数“coolFunction”,其目的仅仅是发出一个叫做“coolSignal”的信号 - 它也可以工作! 我的问题是,我得到预期的输出是一样的控制台:

signal triggered 
state before signal: customState 
state after signal: init 

但“myBtn1”保持隐藏和“myBtn2”保持可见!所以国家并没有真正改变! 任何想法我不了解QML中的状态?

btw:如果我将myBtn2.onClick更改为myRectangle.state = "init";状态转换工作!但我真的需要它发生在一个自定义的C++信号上!

感谢您提前提供任何帮助。

编辑: 我忘了说,我不使用main.qml顶部写的源代码。它位于一个名为MyElem.qml的额外QML文件中,该文件用作listview的委托elem。这意味着运行时有多个MyElem被加载,并且它们都具有相同的id(myRectangle)。这是我没有看到任何视觉变化的原因吗?

+0

我刚才发现,不仅连接中的信号变化没有可见的效果,而且还有其他所有可见的效果,比如'myBtn .visible = false'。那么我需要以某种方式重新渲染矩形? – Chriffer

+0

我现在有同样的问题。你解决了这个问题吗? –

回答

0

Button 1中的onClick处理程序引用了myGame而不是myRectangle。由于Connections中的信号只会将状态重置为init,因此您没有看到任何事情发生,因为您从未成功地将myRectangle的状态更改为init以外的任何状态。在你的输出中应该有一个关于引用一个不存在的对象的错误信息......

+0

thx,为你的回应。不好意思,但myGame是一个只存在于这个例子中的错字。为了专注于主要问题,我将真正的代码减少到了这个程度。 – Chriffer

相关问题