如何在拥有 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 的大量信息,可访问 运行 时间。

祝你好运