Разрыв двусторонней привязки при обновлении QObject - PullRequest
0 голосов
/ 09 июля 2020

У меня есть эти 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
}
...