简体   繁体   English

如何将 C++ 属性绑定到 QML 属性?

[英]How to bind C++ property to QML property?

So I know how to bind QML property to C++ property, so when C++ one calls notify signal, QML updates the view.所以我知道如何将 QML 属性绑定到 C++ 属性,所以当 C++ 调用通知信号时,QML 更新视图。 Is there any way to make C++ property update when user changes something using UI?当用户使用 UI 更改某些内容时,有没有办法使 C++ 属性更新?

For example, I have a Combobox, and I want some C++ property to be updated when user changes value of combobox.例如,我有一个组合框,我希望在用户更改组合框的值时更新某些 C++ 属性。

EDIT: By C++ properties I mean Q_PROPERTY macro in QObject -derived classes.编辑:通过 C++ 属性,我的意思是QObject派生类中的Q_PROPERTY宏。

To bind a property from an object you didn't create in QML (or was created in another context), you have to use Binding .要从不是在 QML 中创建(或在其他上下文中创建)的对象绑定属性,您必须使用Binding In your case :在你的情况下:

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

Perhaps an answer to a similar question would be helpful.也许对类似问题的回答会有所帮助。

It shows how to connect the standard (not custom) qml property with something in C++.它展示了如何将标准(非自定义)qml 属性与 C++ 中的某些内容连接起来。

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.

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM