最大似然不写信给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;
...
}

和暴露的成脱通过一个单一实例

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++财产的更新,每当我拖滑块?

脱:6.2.1
编译器:铛/海湾合作委员会
OS:Windows/Linux

更新:经测试反向的结合。 仍然打印同样的结果

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