2014-10-13 1 views
3

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++ 버전에서 동일한 작업을 수행하도록 지시하려면 어떻게해야합니까?

+0

* exchangeChanged * 신호는 무엇이며 방출 될 때마다 그 값을 텍스트 속성에 재 할당합니다. 속성 바인딩 메커니즘만큼 깨끗하지는 않지만 작동해야합니다. 나는이 행동에 놀랐다. 나는 QML에 * function-result-changed * 신호 같은 것이 존재하지만 결코 얻지 못했습니다. 나는 왜 이것이 효과가 있는지 작은 생각을 가질 수 있지만, 다른 누군가가 설명 할 수 있기를 바랍니다. – Jairo

+0

QML 런타임은 [바인딩이 임의의 복잡성을 가질 수 있기 때문에] 알아낼 수 있습니다. (http://qt-project.org/doc/qt-4.8/propertybinding.html). 함수 호출 뒤에 바인딩을 푸는 것뿐입니다. 코드가 C++에서 너무 단순하다면 ... 절반 밖에 안되는 코드가 5 배 더 많습니다. – pixelgrease

답변

3

현재이를 수행 할 방법이 없습니다.

저는이 기능을 다시 평가하는 것이 좋은 습관이라고 생각하지 않습니다.

Connections { 
    target: converter 
    onRateChanged: output.text = converter.exchange(amountField.text) 
} 

또는 속성으로 교환을() 변환하고, 명령 적 (코드 전체 또는 테스트하지)를 접근 선언적 대신 : 당신은 명시 적으로 필요한 경우를 호출해야

class Convert : public QObject 
{ 
    // ... 
    Q_PROPERTY(double amount READ amount WRITE setAmount NOTIFY amountChanged) 
    Q_PROPERTY(double exchange READ exchange NOTIFY exchangeChanged) 

    // ... 

public: 
    double exchange() { return m_rate * m_amount; } 

private: 
    double m_rate; 
    double m_amount; 
}; 

당신은 것 적절한 장소에서 다양한 * Changed 신호 등을 방출해야합니다.

+0

성능을 위해 C++을 사용하고 수백 개의 바인딩에서 비율 값을 암시 적으로 사용하려고 계획합니다. onRateChanged를 추가하는 것은 규모에 대한 구문이 너무 많아서 포기하는 대신 교환 속성을 검토하고 QML 변환기 패턴 만 사용합니다. – pixelgrease

+0

내가 원했던대로 할 방법이 없었고, 당신이 옳았다. 내가 원했던 것은 Qt 솔루션이 아니 었습니다. 나는 당신이 말한 것을 정확하게 끝내고, 재산을 드러내고 종속적 가치가 변할 때 변화 신호를 방출했다.구현은 매우 간단했습니다. – pixelgrease

관련 문제