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

QT QML中QAbstractListModel拷贝构造函数已删除错误求助

解决QML传递C++模型时的已删除函数错误

问题场景

尝试将C++实现的UserListModel通过UserManager的Q_PROPERTY传递给QML时,编译器触发以下错误:

error C2280: "UserListModel::UserListModel(const UserListModel &)" : Es wurde versucht, auf eine gelöschte Funktion zu verweisen

错误出现在UserManager的getModel方法中,该方法尝试返回私有成员m_listModel。

错误原因

UserListModel继承自QAbstractListModel,而QAbstractListModel是QObject的派生类。Qt为所有QObject派生类默认删除了拷贝构造函数和赋值运算符——这是因为QObject体系基于对象身份而非值语义设计,拷贝操作会破坏对象的父子关系、信号槽连接等核心机制。

当前getModel方法按值返回UserListModel,这会触发编译器尝试调用被删除的拷贝构造函数,从而报错。

修复方案

将模型的返回方式改为指针返回,避免触发拷贝操作:

修改UserManager.h

#pragma once
#include <QObject>
#include <QMap>
#include "UserListModel.h"

class UserManager : public QObject
{
    Q_OBJECT

public:
    explicit UserManager(QObject* parent = nullptr);
    // 将属性类型改为指针,并添加CONSTANT标记(因为模型指针不会改变)
    Q_PROPERTY(UserListModel* model READ getModel CONSTANT)
    // 返回模型的指针
    UserListModel* getModel() { return &m_listModel; }
 
private:
    UserListModel m_listModel;
};

其他代码无需修改

UserListModel的头文件、源文件,以及UserManager.cpp的初始化逻辑都保持原样即可——指针返回不会影响模型的内部数据操作和QML的访问逻辑。

额外提示

在Qt中,所有QObject派生类的传递都应该使用指针或引用,绝对不能按值传递,否则都会触发类似的已删除函数错误。QML也能很好地识别QObject指针类型的属性,直接在QML中通过model.name等方式访问角色即可。

内容的提问来源于stack exchange,提问作者user2377283

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:55:15