QT QML中QAbstractListModel拷贝构造函数已删除错误求助
问题场景
尝试将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

