如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件? [英] How to connect signals from singleton object defined in C++ code to QML component?

查看:60
本文介绍了如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My main objective is to receive signals from singleton objects while defining QML component in *.qml file.

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

Let's say I defined a singleton object in C++ code like this:

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 中:

In 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引擎:

The singleton is successfully registered with QML engine:

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"文件中的某处:

Now, I try to use signals from the singleton. Somewhere in ".qml" file:

import QtQuick 2.1
import MySingleton 1.0

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

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

使用此语法,我收到包含MySingleton.onValueChanged:"的行的不存在的附加对象"错误.请注意,对singletonValue"属性的分配已成功.

Using this syntax I receive the "Non-existent attached object" error for the line containing "MySingleton.onValueChanged:". Note that the assignment to the "singletonValue" property was successful.

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

I also tried to change a syntax to the following:

import QtQuick 2.1
import MySingleton 1.0

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

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

错误消息是元素不可创建",这是意料之中的.

The error message is "Element is not creatable", which is kind of expected.

我的问题是:

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

推荐答案

试试这个:

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

还有

  • 我猜您在删除单例对象时遇到了问题.
  • 您在 onValueChanged: 中有错字 - QML 中没有 consol 对象
  • I guess your have a problem with deletion of singleton object.
  • You have typo in onValueChanged: - there is no consol object in QML

这篇关于如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆