스를 쓰지 않는다면 C++재산을 때에 바인딩 구성요소 및 구성 요소 값 변경

0

질문

에서 일하고 있어요 유저 프로젝트입니다. UI 에서 일하고,필요 모두 업데이트 슬라이더에서는 C++를 읽고 현재 값으로 C++에서의 프로그램입니다... 속성이 될 것으로 보인 솔루션입니다. 지금까지 읽었어요 다른 질문에 그렇지 않고 성공의 두 가지 방법으로는 바인딩 C++모델에서의 프로그램입니다.., 속성을 변경하지 않 트리거 신호,등등....에서 현재를 선언한 숙박 시설에 나의 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;
...
}

노출로 Qt 를 통해 단일

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

그밖에 없는 C++속성을 슬라이더의 프로그램입니다..

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 를 업데이트 프로그램입니다..그것은 슬라이더입니다. 하지만 주어진 그 myClass.myValue 제한된다 slider.value. 나는 가정 모두에 값을 얻는 동시에 업데이트. 그러나 슬라이더를 드래그는 보여줍니다 그들은 다른 값입니다. 다음 그것이 무엇이 인쇄되는 콘솔에서 때 나는 끌어 내니다.

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

또한 setMyValue 지 않을 것 같다 호출되지 않는 한 명시적 할당이처 myClass.myValue = 0. 도 바인딩은 구성 요소 없이 성공입니다. 왜 이런 경우와게 만들 수 있는 C++산 업데이트될 때마다 나는 슬라이더를 끌?

Qt:6.2.1
컴파일러:그램/gcc
운영 체제:윈도우/리눅스

업데이트:을 테스트하 반전 구속력이 있습니다. 여전히 동일한 결과 인쇄

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++시설에스를 사용할 수 있습니다 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();
    }
}

습니다.스:

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ý
..................................................................................................................