【问题标题】:How to bind C++ property to QML property?如何将 C++ 属性绑定到 QML 属性?
【发布时间】:2017-05-26 06:20:50
【问题描述】:

所以我知道如何将 QML 属性绑定到 C++ 属性,所以当 C++ 调用通知信号时,QML 会更新视图。当用户使用 UI 更改某些内容时,有什么方法可以更新 C++ 属性?

例如,我有一个组合框,我希望在用户更改组合框的值时更新一些 C++ 属性。

编辑:C++ 属性是指QObject 派生类中的Q_PROPERTY 宏。

【问题讨论】:

    标签: c++ qt qml qobject


    【解决方案1】:
    1) Firstly you have to create main.cpp page.
    
    #include <QtGui>
    #include <QtDeclarative>
    
    class Object : public QObject
    {
     Q_OBJECT
     Q_PROPERTY( QString theChange READ getTheChange NOTIFY changeOfStatus )
    
     public:
      Object() {
       changeMe = false;
       myTimer = new QTimer(this);
       myTimer->start(5000);
       connect(myTimer, SIGNAL (timeout()), this, SLOT (testSlot()));
      }
    
      QString getTheChange() {
       if (theValue  0) {
        return "The text changed";
       } if (theValue  1) {
        return "New text change";
       }
       return "nothing has happened yet";
      }
    
      Q_INVOKABLE void someFunction(int i) {
       if ( i  0) {
        theValue = 0;
       }
       if (i  1) {
        theValue = 1;
       }
       emit changeOfStatus(i);
      }
    
      signals:
       void changeOfStatus(int i) ;
    
      public slots:
       void testSlot() {
        if (changeMe) {
         someFunction(0);
        } else {
         someFunction(1);
        }
        changeMe = !changeMe;
       }
    
      private:
       bool changeMe;
       int theValue;
       QTimer *myTimer;
    };
    
    #include "main.moc"
    
    int main(int argc, char* argv[])
    {
     QApplication app(argc, argv);
     Object myObj;
     QDeclarativeView view;
     view.rootContext()->setContextProperty("rootItem", (QObject *)&myObj);
     view.setSource(QUrl::fromLocalFile("main.qml"));
     view.show();
     return app.exec();
    }
    
    2) The QML Implementation main.qml
    In the QML code below we create a Rectangle that reacts to mouse clicks. The text is set to the result of the Object::theChange() function.
    
    import QtQuick 1.0
    
    Rectangle {
     width: 440; height: 150
    
     Column {
      anchors.fill: parent; spacing: 20
      Text {
       text: rootItem.theChange
       font.pointSize: 25; anchors.horizontalCenter: parent.horizontalCenter
      }
     }
    }
    
    So, using the approach in the example above, we get away for QML properties to react to changes that happen internally in the C++ code.
    

    来源:https://wiki.qt.io/How_to_Bind_a_QML_Property_to_a_C%2B%2B_Function

    【讨论】:

    • 这是一个低质量的答案:不要在没有注明出处的情况下盲目复制粘贴其他网站,仔细阅读问题。
    【解决方案2】:

    要绑定不是您在 QML 中创建(或在另一个上下文中创建)的对象的属性,您必须使用 Binding。 在你的情况下:

    Binding {
        target: yourCppObject
        property: "cppPropertyName"
        value: yourComboBox.currentText
    }
    

    【讨论】:

      【解决方案3】:

      也许answer to a similar question 会有所帮助。

      它展示了如何将标准(非自定义)qml 属性与 C++ 中的内容连接起来。

      【讨论】:

        猜你喜欢
        • 2018-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多