QML绑定不更新

时间:2015-01-30 15:24:37

标签: c++ qt qml blackberry-10

我有一个带有QML前端的简单BB10应用程序。

GUI由几个按钮和一个标签

组成
Page {
    Container {
        Label {
            text: app.alarmCount()
        }        
        Button {
            text: qsTr("Resend Notification")
            onClicked: {
                app.resendNotification();
            }
        }
        Button {
            text: qsTr("Stop Service")
            onClicked: {
                app.stopService();
            }
        }
        Button {
            text: qsTr("Kill Service")
            onClicked: {
                app.killService();
            }
        }
    }
}

和C ++类

class ApplicationUI: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString alarmCount READ alarmCount NOTIFY AlarmUpdate)
public:
    ApplicationUI();
    virtual ~ApplicationUI() { }

    Q_INVOKABLE void resendNotification();
    Q_INVOKABLE void stopService();
    Q_INVOKABLE void killService();

    QString alarmCount() const;
    void setAlamCount(int newCount);

signals:
    void AlarmUpdate();

private:
    bb::system::InvokeManager* m_invokeManager;

    QString m_alarmCountDisplay;
};

和班级希望相关的一点

QString ApplicationUI::alarmCount() const
{
    return m_alarmCountDisplay;
}

void ApplicationUI::setAlamCount(int newCount)
{
    m_alarmCountDisplay = QString("%1 Alarms").arg(newCount);
    emit AlarmUpdate();
}

我的问题是标签永远不会显示警报计数字符串属性。我已经在emit上设置了一个断点,可以看到它被调用并且在alarmCount()getter上,并且可以看到它返回正确的值,但我的前端实际上从未显示标签的值。

1 个答案:

答案 0 :(得分:1)

您实际上并没有对变量进行绑定。正确的绑定看起来像:

text: app.alarmCount

但是在你的代码中它是:

text: app.alarmCount()

使用您的代码会出错,因为您无法访问Q_OBJECTQ_INVOKABLE的任何public slot方法。但是即使你对你的方法做了这样的标记,这意味着你只能一次获得alarmCount属性,并且它不会被更新,因为你没有进行绑定而只是一个方法调用。