You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

持有视图的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:48:04