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

标签 c++ qt qml qt5

我的主要目标是在 *.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:”的行的“不存在的附加对象”错误。请注意,对“singletonValue”属性的分配已成功。

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

import QtQuick 2.1
import MySingleton 1.0

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

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

错误消息是“Element is not creatable”,这是意料之中的。

我的问题是:

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

最佳答案

试试这个:

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

还有

  • 我猜你在删除单例对象时遇到了问题。
  • 您在 onValueChanged: 中有错字:QML 中没有 consol 对象

关于c++ - 如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26320049/

相关文章:

C++ 矩阵乘法不产生正确的输出

c++ - 计算文件大小

c++ - Qt Creator 中的代码传输

c++ - QT QTcpServer 没有及时连接

qml - Qt 警告 : QQmlComponent: Component is not ready

c++ - QQuickFramebufferObject重绘只显示清晰颜色

c++ - 前向声明未按预期工作

c++ - glMultiDrawElements VBO

c++ - 双向关联容器

c++ - 如何在 CmakeList 中导入 Qtquickcontrol