持有视图的QObject实例时如何监听该视图的widthChanged等信号?
解决方案
你可以直接通过Qt的信号槽机制连接parent对象对应的属性变更信号即可,Qt中所有通过Q_PROPERTY声明的属性,都会自动生成命名规则为[属性名]Changed的通知信号,按以下步骤实现即可:
步骤1:在ConstraintAttached类的头文件中声明处理槽函数
#include <QObject> class ConstraintAttached : public QObject { Q_OBJECT public: explicit ConstraintAttached(QObject *parent = nullptr); // 新增私有槽函数声明 private slots: void onParentWidthChanged(); private: // 可选择性保存父对象指针,也可以每次调用parent()动态获取 QObject* m_targetView = nullptr; };
步骤2:在构造函数中完成信号槽绑定
你可以选择两种绑定方式,优先推荐Qt5以后支持的函数指针语法,可以在编译期做类型检查,避免运行时连接失败:
#include "ConstraintAttached.h" #include <QDebug> ConstraintAttached::ConstraintAttached(QObject *parent) : QObject(parent), m_targetView(parent) { // 先做判空保护,避免传入空指针崩溃 if (!m_targetView) { return; } // 方法1:Qt5/Qt6 函数指针写法(推荐,编译期检查类型) connect(m_targetView, &QQuickItem::widthChanged, this, &ConstraintAttached::onParentWidthChanged); // 方法2:兼容旧版本的SIGNAL/SLOT宏写法,不需要知道父对象具体类型 // connect(m_targetView, SIGNAL(widthChanged()), this, SLOT(onParentWidthChanged())); // 原有初始获取宽度的逻辑保留 int viewWidth = m_targetView->property("width").toInt(); } // 实现槽函数,处理宽度变更逻辑 void ConstraintAttached::onParentWidthChanged() { int newWidth = m_targetView->property("width").toInt(); // 此处编写宽度变更后需要执行的业务逻辑 qDebug() << "Parent width changed to:" << newWidth; }
补充说明
- 所有QML内置属性的变更信号都遵循
属性名首字母小写+Changed的命名规则,如果你需要监听高度变更,绑定heightChanged信号即可 - 因为附加对象的父对象就是你绑定的Rectangle组件,所以当Rectangle销毁时,附加对象会跟随销毁,不需要手动断开信号槽连接,Qt会自动处理失效的连接
- 如果不确定父对象的具体类型,优先使用SIGNAL/SLOT宏的写法,只要目标对象存在对应信号就可以正常连接,连接失败会在运行时输出警告日志方便排查
内容的提问来源于stack exchange,提问作者Mahdi nezam parast
相关产品推荐
相关产品推荐

