如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件?

2024-01-21

我的主要目标是在 *.qml 文件中定义 QML 组件时接收来自单例对象的信号。

假设我在 C++ 代码中定义了一个单例对象,如下所示:

class MySingleton : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString value READ value WRITE setValue NOTIFY valueChanged)

    typedef QObject Base;
public:

    static MySingleton* instance();

    const QString& value() const;
    void setValue(const QString& value);

signals:
    void valueChanged();

private:
    MySingleton(QObject* parent = nullptr);
    QString m_value;
};

在 MySingleton.cpp 中:

MySingleton* MySingleton::instance()
{
    static MySingleton* obj = new MySingleton();
    return obj;
}

const QString& MySingleton::value() const
{
    return m_value;
}

void MySingleton::setValue(const QString& value)
{
    if (value != m_value) {
        m_value = value;
        emit valueChanged();
    }
}

MySingleton::MySingleton(QObject* parent)
  : Base(parent),
    m_value("SomeInitialValue")
{
}

单例已成功注册到 QML 引擎:

QObject *getMySingleton(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    return MySingleton::instance();
}

void qmlRegisterMySingleton()
{
    qmlRegisterSingletonType<MySingleton>("MySingleton", 1, 0, "MySingleton", &getMySingleton);
}

int main(int argc, const char** argv)
{
    ...
    qmlRegisterMySingleton();
    ...
}

现在,我尝试使用来自单例的信号。 “.qml”文件中的某处:

import QtQuick 2.1
import MySingleton 1.0

Rectangle {
    id: someRectangle
    property string singletonValue : MySingleton.value

    MySingleton.onValueChanged: {
       consol.log("Value changed")
    }
}

使用这种语法我收到“不存在的附加对象” 包含“MySingleton.onValueChanged:”的行出现错误。请注意,对“的赋值单例值“财产成功。

我还尝试将语法更改为以下内容:

import QtQuick 2.1
import MySingleton 1.0

Rectangle {
    id: someRectangle
    property string singletonValue : MySingleton.value

    MySingleton {
        onValueChanged: {
            consol.log("Value changed")
        }
    }
}

错误消息是“元素不可创建”,这是一种预期。

我的问题是:

  1. 定义某些 QML 组件时是否可以连接到单例信号?
  2. 如果是,正确的语法是什么?
  3. 如果不是,那么在 QML 文件中定义 UI 元素(小部件)时接收有关核心数据更改事件(在某些单例对象中定义)的通知的正确/可接受的方法是什么?

尝试这个:

Connections {
    target: MySingleton
    onValueChanged: {
        console.log("Value changed")
    }
}

Also

  • 我猜你在删除单例对象时遇到问题。
  • 你有错字onValueChanged:- 没有consolQML 中的对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件? 的相关文章

随机推荐