У меня есть эти TextField
, TextArea
и Button
:
ColumnLayout{
LineField{
id: l1
label: "Name"
Binding{
target: addContext
property: "newPlot.name"
value: l1.text
}
Binding{
target: l1
property: "text"
value: addContext.newPlot.name
}
}
AreaField{
id: a1
label: "Address"
Binding{
target: addContext
property: "newPlot.description"
value: a1.text
}
Binding{
target: a1
property: "text"
value: addContext.newPlot.description
}
}
PathButton{
onClicked: addContext.addNewPlot()
}
}
Оба TextField
и TextArea
имеют двустороннюю привязку с newPlot
. При нажатии кнопки все, что находится в этих полях, вставляется в базу данных, и newPlot
обновляется с помощью оператора new
:
void AddVM::addNewPlot()
{
mvm->db.open();
QSqlQuery query;
query.prepare("INSERT INTO Plots (Name, Description) VALUES(:Name, :Description)");
query.bindValue(":Name", newPlot()->name());
query.bindValue(":Description", newPlot()->description());
query.exec();
mvm->db.close();
setnewPlot(new Plot());
newPlot()->setname("Test");
newPlot()->setdescription("Test");
}
Он работает в обоих направлениях, пока я не нажму кнопку. После обновления привязка c ++ к qml работает, НО привязка qml к c ++ не работает, поэтому, если я изменяю тексты в этих полях, newPlot
на стороне c ++ не обновляется. Я могу обновлять тексты в qml со стороны c ++, например, последние 2 строки Q_INVOKABLE addNewPlot()
изменяют тексты в этих полях.
EDIT
Этот подход на самом деле работает для TextField
и TextArea
:
LineField{
label: "Name"
text: addContext.newPlot.name
onTextChanged: addContext.newPlot.name = text
}
AreaField{
label: "Address"
text: addContext.newPlot.description
onTextChanged: addContext.newPlot.description = text
}