2013-02-17 61 views
6

मैं इसके बारे में मंडलियों में घूम रहा हूं। सिग्नल और स्लॉट के आसपास बस मेरे सिर को लपेट नहीं सकते।कैस्केड और संकेत/स्लॉट

बस कुछ ऐसे तंत्र की तलाश है जो मेरे सी ++ में सिग्नल होने पर स्वचालित रूप से मेरे यूआई को अपडेट कर सकें।

उदाहरण:

मैं Qml में दो लेबल पाठ है कि है: _app.method कि एक मान देता है।

मेरे पास एक बटन है जो onClicked एक Q_INVOKABLE विधि चलाता है। यह विधि सिग्नल को उत्सर्जित करती है जब यह किया जाता है, उदाहरण के लिए, geocordinates प्राप्त करता है और उपरोक्त पाठ के मानों को अद्यतन करता है: असाइनमेंट भरोसा करते हैं।

मुझे जो चाहिए वह पाठ को अपडेट करने के लिए कुछ है: एक बार उन मानों को बदलने के बाद असाइनमेंट।

मुझे बस इन सिग्नल/स्लॉट को स्पष्ट रूप से समझाया जाना चाहिए। प्रलेखन में एकमात्र उदाहरण केवल क्यूएमएल या सी ++ मानते हैं लेकिन दोनों का मिश्रण नहीं है। नमूना कोड में उदाहरण हैं, लेकिन विशेष रूप से दस्तावेज़ीकरण में समझाया नहीं गया है।

यदि आपके पास सादा विवरण था, तो मुझे यकीन है कि मैं इसे अनुकूलित कर सकता हूं। उदाहरण के लिए, 1: इसे QML में परिभाषित करें, 2: इसे एचपीपी फ़ाइल में परिभाषित करें, 3: इन्हें सीपीपी फ़ाइल में परिभाषित करें।

मैंने क्यूओब्जेक्ट के सेटप्रोपरी ("टेक्स्ट", "वैल्यू") का उपयोग करने का प्रयास किया है, लेकिन मेरा प्रयास करने का प्रयास करते समय मेरा ऐप क्रैश हो जाता है।

मुझे बताओ अगर मैं गलत हूँ ...

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) सीपीपी में:

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); 
} 

तो, क्या होता है कि, क्यूएमएल में, ऑनक्लिक विधि कनेक्ट एस एक क्यूएमएल समारोह के साथ संकेत; जिसका मतलब है, अब हम एक मूल्य परिवर्तन के लिए सुन रहे हैं, और जब यह करता है, तो उस समारोह को बुलाया जाएगा। फिर, हम मान बदलते हैं ... चूंकि Q_PROPERTY ने सेट वैल्यू नामक फ़ंक्शन पर लेखन मान सेट किया है, सेट वैल्यू को नए मान के साथ बुलाया जाता है; आंतरिक रूप से, m_iValue बदल जाता है, और एक उत्सर्जन होता है, जो बताता है कि जो कोई भी मूल्य सुन रहा है, उसने कहा कि एक नया मूल्य है।

अरे, मेरा क्यूएमएल यह सुन रहा है! (_app.valueChanged.connect स्क्रिप्ट के माध्यम से)। तो, क्यूएमएल ऑब्जेक्ट (बटन) जो उस पर सुन रहा था, क्या यह वैल्यू चेंज फ़ंक्शन है, जिसे नए मान के साथ बुलाया जाता है (उत्सर्जित मान के कारण (m_iValue)।

कृपया मुझे बताएं कि मैंने यह पता लगाया है ?? !

उत्तर

10

यदि आप Q_PROPERTY मैक्रो का उपयोग कर रहे हैं, तो बटन के पाठ को बदलने के लिए स्पष्ट रूप से एक फ़ंक्शन के साथ वैल्यू चेंज सिग्नल पर बाध्य करने की कोई आवश्यकता नहीं है। और आपको m_iValue के साथ मूल्य का चयन करने की आवश्यकता नहीं है।इसी फाइलों में नीचे वर्णित परिवर्तन करें

QML:

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

HPP:

signals: 
    void valueChanged(); 

सीपीपी:

फेंकना valueChanged();

+0

वाह ... जो किसी भी तरह काम करता है, सिग्नल/स्लॉट जादू के लिए धन्यवाद। क्या कोई काम में कोई विशेष कीवर्ड है जो यह काम करता है? –

+0

कोई भी मुझे पता नहीं है –