如何通知 QML 项目其属性已更改?

Posted

技术标签:

【中文标题】如何通知 QML 项目其属性已更改?【英文标题】:How to notify QML item that its property has changed? 【发布时间】:2016-12-14 21:33:24 【问题描述】:

我有一个包装了另一个普通对象的 QObject:

#include "qmlnote.h"

QString QmlNote::title() const 
    return note_.title();


void QmlNote::reload(const Note &note) 
    note_ = note;

我使用这个在 QML 中加载:

ctxt->setContextProperty("note", &qmlNote);

后来我把它换成不同的注释:

qmlNote.reload(newNote);

然后在 QML 中,当这个注释发生变化时,我想做一些事情:

import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1

Item 

    property QtObject note

    onNoteChanged: 
        console.info(note.title)
    


我希望在我调用reload() 时触发onModelChanged(),但它没有发生。我想我需要从某个地方发出一些信号来通知 QML 视图注释已更改,但不确定在哪里。我以为我可以从reload() 发出信号,但似乎QObject 没有内置的changed 信号。

关于如何处理这个问题有什么建议吗?

【问题讨论】:

【参考方案1】:

仅当实际对象发生变化时才会发出信号,也就是说,将不同的对象分配给属性。在您的情况下,它将始终是同一个对象。此外,您还没有真正为该属性分配任何内容。如果您已经将该对象公开为上下文属性,那么您只需要这样做。

您可以简单地实现一个信号 noteChanged() 并在 C++ 中每次重新加载时发出它。在 qml 方面,您可以使用 Connections 元素为其实现处理程序。

Connections 
    target: qmlNote
    onNoteChanged: console.info(qmlNote.title)

【讨论】:

另外,如果你在 QmlNote 类上将“title”设置为一个属性,你可以在任何属性绑定中使用note.title,当你发出该属性的更改信号时,它将被重新读取 我会建议这样做,但示例代码不会在绑定中使用它。在大多数情况下,实现适当的属性是一个好主意。

以上是关于如何通知 QML 项目其属性已更改?的主要内容,如果未能解决你的问题,请参考以下文章

QML 绑定整数属性 - c++ 中的更改未发送到 QML

如何通知所有窗口静态属性已更改?

从元对象获取属性更改通知

Qml:如何为所有 GridView 项目设置属性

如何在属性更改 QML 上实现行为动画

如何在重用 QML 组件时读写属性更改