2013-02-17 86 views
6

我在圈子里跑来跑去。只是无法将我的头围绕信号和插槽。级联和信号/插槽

只是寻找一些机制,可以自动更新我的用户界面时,我的C + +信号发生。

例子:

我在设为Qml两个标签有文字:_app.method返回一个值。

我有一个按钮,onClicked运行Q_INVOKABLE方法。该方法完成后会发出一个信号,例如,获取地理坐标并更新上述文本:赋值依赖的值。

我想要的是更新文本:分配一旦这些值改变。

我只需要这些信号/槽说明明白。文档中的唯一示例似乎只假定QML或C++,但不是两者的组合。示例代码有示例,但在文档中没有特别说明。

如果你有明确的描述,我确定我可以适应它。例如,1:在QML中定义这个,2:在hpp文件中定义这个,3:在cpp文件中定义这些。

我试过使用QObject的setPropery(“文本”,“值”),但我的应用程序崩溃时尝试这一点。

告诉我,如果我错了...

1)QML:

Button { 
    id: aButton 
    text: _app.value 
    onClicked: { 
     _app.valueChanged.connect(aButton.onValueChanged); 
     _app.value = _app.value + 1; 
    } 
    function onValueChanged (val) { 
     aButton.text = "New value: " + val; 
    } 
} 

2)HPP:

Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged) 
public: 
    int value(); 
    void setValue(int i); 
signals: 
    void valueChanged(int); 
private: 
    int m_iValue; 

3)在CPP:

int class::value() 
{ 
    return m_iValue; 
} 

void class::setValue(int i) 
{ 
// name is same as HPP WRITE Q_PROPERTY statement 
    m_iValue = i; 
    emit valueChanged(m_iValue); 
} 

所以会发生的是,在QML中,onClick方法CONNECT S带有QML函数的信号;这意味着,现在我们正在侦听一个值的变化,当它发生时,这个函数将被调用。那么,我们改变这个值...因为Q_PROPERTY将写入值设置为一个名为setValue的函数,setValue被调用了新的值;在内部,m_iValue被改变,并且发生发射,这告诉正在监听valueChanged的人有新值。

嘿,我的QML正在听! (通过_app.valueChanged.connect脚本)。因此,正在监听的QML对象(Button),它的onValueChanged函数被调用,并带有新的值(因为发出了valueChanged(m_iValue)。)

请告诉我,我已经想通了? !

回答

10

如果您使用的是Q_PROPERTY宏,则不需要将onValueChanged信号与函数进行显式绑定来更改按钮的文本,也不需要使用m_iValue发出valueChanged信号。使在对应的文件下面提到变化

QML:

Button { 
    horizontalAlignment: HorizontalAlignment.Center 
    verticalAlignment: VerticalAlignment.Center 
    id: aButton 
    text: _app.value 
    onClicked: { 
     _app.value = _app.value + 1 
    } 
} 

HPP:

signals: 
    void valueChanged(); 

CPP:

发射的valueChanged();

+0

哇...它以某种方式工作,这要归功于SIGNAL/SLOT魔法。 是否有任何特殊的关键字在使这项工作? – 2013-02-18 15:18:13

+0

没有任何我知道的 – 2013-02-18 18:23:03