CML 클래스의 메서드를 QML 구성 요소 속성에 바인딩하고 종속 속성이 변경되면 다시 평가하려고합니다. 내가 그렇게 같은 속성에 exchange
함수의 결과를 할당하면 rate
가 변경 될 때종속 속성 변경시 qml 속성에 바인딩 된 C++ 함수를 다시 평가하는 방법은 무엇입니까?
Text { text: converter.exchange(100) }
텍스트 요소가 자동으로 업데이트됩니다,
// Converter.qml:
import QtQuick 2.0
QtObject {
property double rate: 1
function exchange(amount) { return amount * rate }
}
다음 QML 구성 요소는 내가 원하는 않습니다. 이것은 QML 구성 요소와 함께 작동하지만 C++ 클래스로 수행하는 방법을 모르겠습니다.
나는 C++의 기능이 동일한 클래스 구현하고 싶습니다 :
#include <QObject>
class Convert : public QObject
{
Q_OBJECT
Q_PROPERTY(double rate READ rate WRITE setRate NOTIFY rateChanged)
public:
explicit Convert(QObject *parent = 0)
: QObject(parent), m_rate(1.0)
{ }
signals:
void rateChanged();
public slots:
double exchange(double amount) { return m_rate * amount; }
double rate() { return m_rate; }
void setRate(double r) {
m_rate = r;
emit rateChanged();
}
private:
double m_rate;
};
rate
속성은 QML에서 액세스 할 수 있지만 '교환'을 다시 평가해야한다는 QML 엔진에 신호를하지 않습니다 그것을 변화를 . 나는 amountInput
, 하지만 내가 rateInput
을 변경하지 않을 경우 변경할 때 나는, 출력이 업데이트됩니다 CppConverter
을 사용하는 경우
// main.qml
import QtQuick 2.1
import QtQuick.Controls 1.1
import Utils 1.0
ApplicationWindow {
width: 300; height: 200
visible: true
// Converter { id: converter; rate: rateField.text }
CppConverter { id: converter; rate: rateField.text }
Column {
TextField { id: rateInput; text: '0.41' }
TextField { id: amountInput; text: '100.00' }
Text { id: output; text: converter.exchange(amountField.text).toFixed(2) }
}
}
:
여기 내 main.qml입니다. QML 변환기 요소에 주석을 달면 업데이트가 정상적으로 작동합니다.
QML 변환기를 사용하면 QML 런타임에서 속도 속성에 대한 종속성을 확인하고 속도가 변경 될 때 교환 기능을 다시 평가합니다. QmlEngine에 C++ 버전에서 동일한 작업을 수행하도록 지시하려면 어떻게해야합니까?
* exchangeChanged * 신호는 무엇이며 방출 될 때마다 그 값을 텍스트 속성에 재 할당합니다. 속성 바인딩 메커니즘만큼 깨끗하지는 않지만 작동해야합니다. 나는이 행동에 놀랐다. 나는 QML에 * function-result-changed * 신호 같은 것이 존재하지만 결코 얻지 못했습니다. 나는 왜 이것이 효과가 있는지 작은 생각을 가질 수 있지만, 다른 누군가가 설명 할 수 있기를 바랍니다. – Jairo
QML 런타임은 [바인딩이 임의의 복잡성을 가질 수 있기 때문에] 알아낼 수 있습니다. (http://qt-project.org/doc/qt-4.8/propertybinding.html). 함수 호출 뒤에 바인딩을 푸는 것뿐입니다. 코드가 C++에서 너무 단순하다면 ... 절반 밖에 안되는 코드가 5 배 더 많습니다. – pixelgrease