如何在拥有 QObject 实例的同时收听视图的信号?
How to listen to the signal of a view while having a QObject instance of it?
我已按照 here 所述创建了一个附加对象。
这是我的 qml 文件,我在其中使用了附加对象 (Constraint.widthInParent
):
Window {
id: root
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: rect
color: "black"
height: width
Constraint.widthInParent: 0.2
}
}
在上面的示例中,我在 ID 为 rect
的 Rectangle 中使用了附加对象,在这个 cpp 文件中,我通过使用我拥有的 QObject 实例获取了 Rectangle 的宽度:
ConstraintAttached::ConstraintAttached(QObject *parent) : QObject(parent) {
int viewWidth = parent->property("width").toInt();
}
现在我想这样听信号...
我的 Rectangle 有一个 widthChanged
信号,现在,我想通过我拥有的 QObject
实例接收该信号。
那么,如何通过 QObject
实例收听视图信号(例如 widthChanged
)?
因为您已经有一个指向 QML 引擎内部的 QObject*
的有效指针,您可以简单地对任何其他 QObject
.
做任何事情
所以,简短的回答是:
connect(parent, SIGNAL(widthChanged()), this, SLOT(doSomething()));
这是较旧的 signal/slot 语法,您可以在其中使用 SIGNAL()
和 SLOT()
宏,而不是传递函数指针或 lambda 函数。
但是让我们进一步熟悉Qt元对象系统。
您可以在您手头的 QObject*
上 运行 此代码,以获取有关其功能的更多信息。假设您仍然拥有 QObject* parent
:
auto methodCount = parent->metaObject()->methodCount();
for(int i = 0 ; i<methodCount ; ++i){
auto method = parent->metaObject()->method(i);
qDebug() << method.methodSignature();
}
这将列出 QObject* parent
的所有方法。阅读 QMetaObject and QMetaMethod 的文档以了解其他可能性。实际上,MOC 正在生成有关单个 QObject
的大量信息,可访问 运行 时间。
祝你好运
我已按照 here 所述创建了一个附加对象。
这是我的 qml 文件,我在其中使用了附加对象 (Constraint.widthInParent
):
Window {
id: root
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: rect
color: "black"
height: width
Constraint.widthInParent: 0.2
}
}
在上面的示例中,我在 ID 为 rect
的 Rectangle 中使用了附加对象,在这个 cpp 文件中,我通过使用我拥有的 QObject 实例获取了 Rectangle 的宽度:
ConstraintAttached::ConstraintAttached(QObject *parent) : QObject(parent) {
int viewWidth = parent->property("width").toInt();
}
现在我想这样听信号...
我的 Rectangle 有一个 widthChanged
信号,现在,我想通过我拥有的 QObject
实例接收该信号。
那么,如何通过 QObject
实例收听视图信号(例如 widthChanged
)?
因为您已经有一个指向 QML 引擎内部的 QObject*
的有效指针,您可以简单地对任何其他 QObject
.
所以,简短的回答是:
connect(parent, SIGNAL(widthChanged()), this, SLOT(doSomething()));
这是较旧的 signal/slot 语法,您可以在其中使用 SIGNAL()
和 SLOT()
宏,而不是传递函数指针或 lambda 函数。
但是让我们进一步熟悉Qt元对象系统。
您可以在您手头的 QObject*
上 运行 此代码,以获取有关其功能的更多信息。假设您仍然拥有 QObject* parent
:
auto methodCount = parent->metaObject()->methodCount();
for(int i = 0 ; i<methodCount ; ++i){
auto method = parent->metaObject()->method(i);
qDebug() << method.methodSignature();
}
这将列出 QObject* parent
的所有方法。阅读 QMetaObject and QMetaMethod 的文档以了解其他可能性。实际上,MOC 正在生成有关单个 QObject
的大量信息,可访问 运行 时间。
祝你好运