Qt 验证签入后端导致QML绑定循环
我有一个类,它是我的应用程序的后端,它执行验证检查: 后端.hQt 验证签入后端导致QML绑定循环,qt,data-binding,qml,qtquick2,qt-quick,Qt,Data Binding,Qml,Qtquick2,Qt Quick,我有一个类,它是我的应用程序的后端,它执行验证检查: 后端.h class Backend : public QObject { Q_OBJECT Q_PROPERTY(quint8 hours READ getHours WRITE setHours NOTIFY hoursChanged) public: Backend(); quint8 getHours() const; void setHours(quint8 value); Q_IN
class Backend : public QObject
{
Q_OBJECT
Q_PROPERTY(quint8 hours READ getHours WRITE setHours NOTIFY hoursChanged)
public:
Backend();
quint8 getHours() const;
void setHours(quint8 value);
Q_INVOKABLE void reset();
signals:
void hoursChanged();
private:
quint8 m_hours = 0;
};
后端.cpp
quint8 Backend::getHours() const
{
return m_hours;
}
void Backend::setHours(quint8 value)
{
if(m_hours == value)
return;
if(value > 23)
value = 23;
m_hours = value;
emit hoursChanged();
}
void Backend::reset()
{
qDebug() << "reset - old value:" << getHours();
setHours(0);
}
这很好,边界检查也很有效。如果我键入一个大于23的值,它将重置为23。但在这种情况下,我也得到了信息:
qrc:/main.qml:19:5:qml绑定:检测到属性“value”的绑定循环
这是为什么?我如何解决这个问题?您的代码确实引入了循环 要打破“绑定循环”,您应该调用Backend方法自动格式化
onTextChanged
信号上的文本字段值:
TextField {
id: textFieldHours
onTextChanged: {
backend.hours = textFieldHours.text
textFieldHours.text = backend.hours
}
}
如果您需要在启动时从后端使用一些值初始化TextField,可以在组件中执行。onCompleted:
方法
另外,似乎最好在后端实现新方法,将输入的小时数作为输入并返回格式化值。内部实现可以将更改的值存储在私有成员中。您的代码确实引入了循环 要打破“绑定循环”,您应该调用Backend方法自动格式化
onTextChanged
信号上的文本字段值:
TextField {
id: textFieldHours
onTextChanged: {
backend.hours = textFieldHours.text
textFieldHours.text = backend.hours
}
}
如果您需要在启动时从后端使用一些值初始化TextField,可以在组件中执行。onCompleted:
方法
另外,似乎最好在后端实现新方法,将输入的小时数作为输入并返回格式化值。内部实现可以将更改后的值存储在私有成员中。我认为每次
value
大于23时,您都在解雇hoursChanged
。在与m_小时
进行比较之前,尝试移动值
验证。我认为每次值
大于23时,您都在发射小时数更改
。在与m_小时
进行比较之前,尝试移动值
验证。