QML ไม่ได้เขียนไปยั C++ทรัพย์สินที่ถูกส่วนประกอบและส่วนประกอบเปลี่ยนแปลงค่า

0

คำถาม

ฉันกำลังทำงานอยู่บน QML โครงการ ในส่วนติดต่อผู้ใช้ของฉันกำลังทำอยู่ฉันต้องการให้ทั้งสองปรับปรุงแถบเลื่อนอกจาก C++และอ่านค่าปัจจุบันใน C++จาก QML. คุณสมบัติเหมือนจะถูกทางออกหรอกนะ ตอนนี้ฉันอ่านแตกต่างคำถามขึ้นแล้วโดยไม่มีความสำเร็จ งสองทางเชื่อม C++แบบใน QML, เปลี่ยนคุณสมบัติของไม่กระตุ้นสัญญาณ,etc...อยู่ในปัจจุบันรหัสฉันประกาศให้เป็นทรัพย์สินของฉันอยู่ในชั้นเรียนภาษา C++language

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 ผ่านทาง singleton

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 คือ bounded ต้อง slider.value. ฉันคิดว่ากค่าทั้งคู่จะปรับปรุงในเวลาเดียวกัน แต่ลากรดบอกระดับบนแถบเลื่อนแสดงว่าพวกเขาต้องแตกต่างค่า. ต่อไปนี้มันคืออะไรพิมพ์ออกในคอนโซลตอนที่ฉันลากของแถบเลื่อน.

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

ยิ่งไปกว่านั้น setMyValue ดูเหมือนจะไม่ถูกเรียกเว้นแต่เป็น explicit การบ้านทำเหมือน myClass.myValue = 0. ฉันยังพยายามที่เชื่อมส่วนประกอบไม่เคยประสบความสำเร็จ แล้วทำไมนี่ถึงเป็นเรื่องคดีและฉันทำให้ C++ทรัพย์สินปรับปรุงเมื่อไหร่ก็ตามที่ฉันลากไปวิ่งสไลด์อยู่รึเปล่า?

Qt:6.2.1
คอมไพเลอร์:clang/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++language ทรัพย์สินจาก 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ł

ขอบคุณสำหรับตอบกลับ. ฉันพยายามที่แนะนำให้ทางออกหรอกนะ แต่ยังไม่เห็นค setter เรียกว่าหรือค่าของ 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);

ข้อมูลตั้งค่าโครงการ:

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

คุณกำลังพลาดสัญญาณตอนที่รุงภาพลักษณ์ที่สมบูรณ์ในค่า:div(ค่า;ค่า;...)

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่