2013-02-17 82 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