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

时间:2014-10-11 22:46:24

标签: c++ qt qml qt5

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

假设我在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")
        }
    }
}

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

我的问题是:

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

1 个答案:

答案 0 :(得分:9)

试试这个:

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

另外

  • 我猜您删除单件对象时遇到问题。
  • 您在onValueChanged:中输错了 - QML中没有consol个对象