【问题标题】:QML binding not updatingQML 绑定未更新
【发布时间】:2015-01-30 15:24:36
【问题描述】:

我有一个带有 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 上可以看到它返回了正确的值,但我的前端实际上从未显示标签的值。

【问题讨论】:

  • 正如我在 Victor 的回答中提到的那样,您确实应该收到一条错误消息。
  • 我绝对没有收到错误。也就是说,我也有 Momentics IDE 不断告诉我 Q_OBJECT 是一个语法错误,确保项目设置了正确的库再多也无法说服它。
  • 要总结所有错误报告,我没有收到任何错误的原因是在 Momentics 中获取 QML 错误,您必须将应用程序作为 QML Debug 运行。常规的 Debug 目标隐藏了所有内容,只在 C++ 代码上工作。

标签: c++ qt qml blackberry-10


【解决方案1】:

您实际上并没有对变量进行绑定。正确的绑定如下所示:

text: app.alarmCount

但在你的代码中是:

text: app.alarmCount()

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

【讨论】:

  • 这是正确的答案,但是关于它调用函数的部分是错误的。如果你运行 OP 的代码,你会得到类似TypeError: Property 'alarmCount' of object ApplicationUI(0x18f6a0) is not a function 的东西。它不是插槽或可调用函数,它不存在。
  • 还没有这样的错误,但我同意你的观点:因为它不是 Q_INVOKABLE 或公共插槽,我们无法访问它。感谢您指出。但是为什么@Saurbaum 那时没有抱怨错误消息..?
  • 我只能猜测他们没有费心检查应用程序输出,尽管在 Qt Creator 中,每当打印某些内容时都会显示应用程序输出窗格...
  • 这确实是问题所在。不,无论是在编译时还是在运行时的控制台窗口中,都绝对没有错误。
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多