【发布时间】:2017-05-05 02:51:43
【问题描述】:
我正在尝试了解有关 QtQuick 和 QML 的更多信息。我目前的目标是了解如何将数据从 C++ 模型绑定到我的视图。到目前为止,我已经能够在我的 QML 中设置模型并从模型中获取数据,但我不知道如何更新我的数据。
如何为我的 C++ 模型设置双向绑定?下面是我目前写的代码。
message.h
class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString author READ getAuthor WRITE setAuthor NOTIFY authorChanged)
Q_PROPERTY(QString message READ getMessage WRITE setMessage NOTIFY messageChanged)
Q_SIGNALS:
void authorChanged(QString author);
void messageChanged(QString message);
public:
Message(QObject *parent = 0);
QString getAuthor();
void setAuthor(QString author);
QString getMessage();
void setMessage(QString message);
private:
QString _author;
QString _message;
};
message.cpp
#include "message.h"
Message::Message(QObject *parent) : QObject(parent)
{
}
QString Message::getAuthor()
{
return _author;
}
void Message::setAuthor(QString author)
{
if(author != _author)
{
_author = author;
emit authorChanged(author);
}
}
QString Message::getMessage()
{
return _message;
}
void Message::setMessage(QString message)
{
if(message != _message)
{
_message = message;
emit messageChanged(message);
}
}
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import com.butts.messaging 1.0
ApplicationWindow {
visible: true
width: 640
height: 480
title: "Test"
Message {
id: testMessage
author: "Batman"
message: "Hello World!"
}
Flow {
TextField {
text: testMessage.message
}
Label {
text: testMessage.message
}
}
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "message.h"
int main(int argc, char *argv[])
{
qmlRegisterType<Message>("com.butts.messaging", 1, 0, "Message");
//Message msg = Message();
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
附:我在这方面是个大菜鸟,所以请随时指出我的代码中存在的任何其他问题(格式、标准等),我需要以某种方式学习大声笑
编辑 1
阅读@derM 的回答后,我更改了代码以实现我想要的效果
TextField {
id: editor
//Binding model -> view
text: testMessage.message
//Binding model <- view
Binding {
target: testMessage
property: "message"
value: editor.text
}
}
Label {
id: display
//Binding model -> view
text: testMessage.message
}
【问题讨论】:
-
在QtWS 2019上有一个关于这个话题的演讲:youtu.be/G6W6MSzM7rskdab.com/wp-content/uploads/stories/…
-
derM 的回答很好地洞察了属性绑定及其陷阱。但是user240515 的回答提出了一个更简洁的解决方案。
-
@amura.cxg 考虑将您使用的解决方案移至单独的答案,而不是将其发布在您的问题中(根据 SO 政策的要求),否则 derM 的答案似乎是唯一正确的答案。