QML नहीं करता है लिखने के लिए सी++ संपत्ति जब करने के लिए बाध्य घटक और घटक मूल्य में परिवर्तन

0

सवाल

मैं पर काम कर रहा हूँ एक QML परियोजना है । यूआई में मैं पर काम कर रहा हूँ, मैं की जरूरत है दोनों के लिए अद्यतन स्लाइडर C++ से पढ़ने के लिए और वर्तमान मूल्य में C++ से QML. गुण लगता है होना करने के लिए सही समाधान है । अब तक मैंने पढ़ा है विभिन्न सवालों पर तो सफलता के बिना दो तरह से बाध्यकारी C++ में QML, बदल गुण नहीं ट्रिगर संकेत, आदि... मेरे वर्तमान कोड मैं की घोषणा की संपत्ति में C++ वर्ग

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass(QObject*);
    Q_PROPERTY(double myValue READ getMyValue WRITE setMyValue NOTIFY myValueChanged)

    void setMyValue(double n) {
        std::cerr << "myValue  being update: " << n << "\n";
        myValue = n;
    }

    double myValue = 30;
...
}

और यह क्यूटी के माध्यम से एक सिंगलटन

qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);

तो बाध्य C++ संपत्ति के लिए एक QML स्लाइडर

import com.me.test
ApplicationWindow {
    Slider {
        id: slider
        height: 30
        width: 100
        from: 0
        to: 100
        value: myClass.myValue
        onValueChanged {
            console.log("value = " + value)
            console.log("myClass.myValue = " + myClass.myValue)
        }

        /* Doesn't help
        Binding {
            target: slider
            property: "value"
            value: myClass.myValue
        }*/
    }
}

बाध्यकारी काम करने लगता है. मैं संशोधित कर सकते हैं के मूल्य myValue फिर फेंकना myValueChanged बनाने के लिए QML अद्यतन यह स्लाइडर. लेकिन यह देखते हुए कि myClass.myValue घिरा हुआ है slider.value. मुझे लगता है कि दोनों के मूल्यों को अद्यतन किया जाता है एक ही समय में. लेकिन स्लाइडर खींचने से पता चलता है कि वे विभिन्न मूल्यों. निम्नलिखित यह क्या है मुद्रित कंसोल में जब मैं खींचें मेरी स्लाइडर.

qml: value = 19.863013698630137
qml: myClass.myValue = 30

इसके अलावा setMyValue लगता है के लिए नहीं बुलाया जा रहा है जब तक एक स्पष्ट असाइनमेंट की तरह बना दिया है myClass.myValue = 0. मैं भी करने की कोशिश की बाध्यकारी घटक के बिना सफलता. क्यों है इस मामले में हो सकता है और मैं C++ संपत्ति अद्यतन जब भी मैं स्लाइडर खींचें?

क्यूटी: 6.2.1
संकलक: बजना/जीसीसी
ओएस: Windows/लिनक्स

अद्यतन: परीक्षण किया है, एक रिवर्स बाध्यकारी है । अभी भी मुद्रण एक ही परिणाम

import com.me.test
ApplicationWindow {
    Slider {
        id: slider
        height: 30
        width: 100
        from: 0
        to: 100
        value: myClass.myValue
        onValueChanged {
            console.log("value = " + value)
            console.log("myClass.myValue = " + myClass.myValue)
        }
        Binding {
            target: myClass
            property: "myValue"
            value: slider.value
        }
    }
}
c++ qml qt qt6
2021-11-24 06:49:49
3
0

अद्यतन करने के लिए C++ से संपत्ति QML, आप का उपयोग कर सकते हैं Binding:

import com.me.test
ApplicationWindow {
    Slider {
        id: slider
        height: 30
        width: 100
        from: 0
        to: 100
        value: myClass.myValue
        onValueChanged {
            console.log("value = " + value)
            console.log("myClass.myValue = " + myClass.myValue)
        }
         // C++ property was bounded to QML above, now we should bind QML to C++
        Binding {
            target: myClass 
            property: "myValue"
            value: slider.value
        }
    }
}
2021-11-24 09:12:14

क्या होता है जब myClass.myValue अद्यतन किया जाएगा और आग जाएगा अपनी myValueChanged?
folibis

@folibis यह अद्यतन स्लाइडर मूल्य की संपत्ति. बेशक, setMyValue विधि के साथ शुरू करना चाहिए के बीच तुलना के एक नए मूल्य और मौजूदा मूल्य, और फेंकना myValueChanged यदि केवल मूल्य वास्तव में किया गया था अद्यतन किया जाता है । अन्य मामले में, आप देख सकता है, एक बाध्यकारी पाश
Jakub Warchoł

उत्तर के लिए धन्यवाद. मैं कोशिश करने का सुझाव दिया समाधान. लेकिन अभी भी नहीं देख सेटर कहा जाता है और न ही मूल्य के console.log("myClass.myValue = " + myClass.myValue) बदल दिया है ।
Mary Chang

@MaryChang उपरोक्त कोड में, आप देखेंगे console.log("myClass.myValue = " + myClass.myValue) जब आप ले जाने के लिए एक स्लाइडर है. देखने के लिए myClass.myValue मूल्य बदल गया है, पर एक नजर है कनेक्शन
Jakub Warchoł
0

यहाँ की एक न्यूनतम काम करने का उदाहरण दो तरह से अद्यतन स्लाइडर:

main.cpp:

data dataObj;
engine.rootContext()->setContextProperty("dataCpp", (QObject*)&dataObj);

डेटा.h:

class data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:
    explicit data(QObject *parent = nullptr);
    int value(void);
    void setValue(int new_value);
public slots:
    void reset(void);
signals:
    void valueChanged();
private:
    int dataValue;
};

data.cpp:

data::data(QObject *parent) : QObject(parent)
{
    dataValue = 250;
}

int data::value()
{
    return dataValue;
}

void data::setValue(int new_value)
{
    if(dataValue != new_value)
    {
        qDebug() << "setting" << new_value;
        dataValue = new_value;
        emit valueChanged();
    }
}

void data::reset()
{
    if(dataValue != 0)
    {
        qDebug() << "resetting to 0";
        dataValue = 0;
        emit valueChanged();
    }
}

मुख्य.qml:

Slider {
    id: slider
    height: 50
    width: 500
    from: 0
    to: 500
    live: false
    value: dataCpp.value
    onValueChanged: dataCpp.value = value
}

Button{
    anchors.top: slider.bottom
    text: "Reset"
    onPressed: dataCpp.reset()
}
2021-12-14 13:21:29
0

आप याद कर रहे हैं जब संकेत को संशोधित करने के लिए मूल्य:

Q_PROPERTY(double myValue READ getMyValue WRITE setMyValue NOTIFY myValueChanged)

इसका मतलब यह है कि आप वादा करता हूँ आप भेज myValueChanged संकेत जब भी C++ कोड में परिवर्तन मूल्य । तो निम्न कार्य करना चाहिए:

void setMyValue(double n) {
    std::cerr << "myValue  being update: " << n << "\n";
    myValue = n;
    emit(myValueChanged());
}
2021-12-14 15:18:53

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में