Qt 验证签入后端导致QML绑定循环

Qt 验证签入后端导致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

我有一个类,它是我的应用程序的后端,它执行验证检查:

后端.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_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_小时
进行比较之前,尝试移动
验证。