2016-10-06 2 views
0

В Qt + QML, я использую Q_PROPERTY много. Сигналы NOTIFY превосходны, чтобы переоценить значение.Как сообщить Q_PROPERTY только один раз

class SomeComponent: public QObject 
{ 
public: 
    const QString& GetMyValue(void) const; 
    void SetMyValue(const QString &value); 

    Q_PROPERTY(QString myValue READ GetMyValue WRITE SetMyValue NOTIFY myValueChanged) 

signals: 
    void valueChanged(); 
} 


Text { 
    text: myComponent.myValue 
} 

То, что я пытаюсь сделать это, что теперь у меня есть сценарий, где я только хочу, чтобы получить значение один раз, и не позволить ему обновить в QML.

Например: Я хочу, чтобы пользователь мог знать предыдущее значение, сохраняя при этом возможность его изменить.

TextInput { 
    text: myComponent.myValue 
    onAccepted:{ 
     myComponent.myValue = text 
    } 
} 
Text { 
    text: "OldValue: " + myComponent.myValue 
} 

Если я сейчас набираю TextInput и нажимаю Enter, текст в элементе Text также обновляется. Как я могу это предотвратить?

Могу ли я отключиться от имущества?

Или это единственный способ изменить: GetMyValue и SetMyValue - Q_INVOKABLE?

+0

Вы хотите, чтобы QML отображал старое значение, но хотите ли вы, чтобы модель C++ хранила старое или новое значение? – user2436719

+0

Я хочу, чтобы модель C++ всегда имела новое значение. Только в QML, я хочу, чтобы иметь возможность решить, какое значение я хочу видеть, в моем примере пусть Text имеет значение myValue, когда был создан элемент Text. Например, это может быть достигнуто через Q_INVOKABLE. Я хочу знать, есть ли другой способ. – RvdK

+0

«f Теперь я ввожу текст TextInput, текст в элементе Text также обновляется» - вы уверены в этом? Потому что это не должно. Ваш код имеет привязку одного направления - изменение myValue изменит текст TextInput, но изменение TextInput не изменит myValue. – dtech

ответ

0

Вам необходимо удалить это: text: "OldValue: " + myComponent.myValue, потому что чтение myComponent.myValue получит значение из C++, позвонив по номеру GetMyValue.

В QML, вы создаете функцию

function updateDisplay(){ 
    iText.text = "OldValue: " + myComponent.myValue 
} 
Text { 
    id: iText 
    text: "OldValue: " 
} 

и вы называете updateDisplay() от C++ каждый раз, когда вы хотите, чтобы обновить значение.

В принципе, в QML, если вы читаете значение C++ (var aValue = myCPPComponent.myValue), он будет вызывать геттер, указанный в Q_PROPERTY, и если вы установите значение (myCPPComponent.myValue = aValue), он вызовет сеттер. Всегда.