如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件? [英] How to connect signals from singleton object defined in C++ code to QML component?
问题描述
我的主要目标是在 *.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.
我的问题是:
- 在定义一些 QML 组件时是否可以连接到单例信号?
- 如果是,正确的语法是什么?
- 如果不是,在 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 noconsol
object in QML
这篇关于如何将 C++ 代码中定义的单例对象的信号连接到 QML 组件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!