QT QML QAbstractListModel 删除函数错误

QT QML QAbstractListModel deleted function error

提问人:user2377283 提问时间:1/21/2023 更新时间:1/21/2023 访问量:67

问:

我正在尝试将 c++ 用户模型传递给 qml 并得到一个我不明白的错误。

我使用一个管理器类,它应该读取用户并填充列表模型。

列表模型本身应该通过 Q_PROPERTY 传递给 qml。

manager 类在 qml 上下文中是已知的。

在管理器类的 public 方法中,编译器告诉我私有m_listModel是一个已删除的函数。

用户管理器.h

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

class UserManager : public QObject
{
    Q_OBJECT

public:
    explicit UserManager(QObject* parent = nullptr);
    Q_PROPERTY(UserListModel model READ getModel)
    UserListModel getModel() { return m_listModel; }
 
private:
    UserListModel m_listModel;
};

UserListModel getModel() { return m_listModel; } 给出错误 m_listModel

错误是这个

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

UserManager.cpp

#include "UserManager.h"

UserManager::UserManager(QObject* parent) 
{
    
}

void UserManager::initialize(QMap<QString, QString> args)
{
    
    m_listModel.addModel(UserModel("user1", "0000"));
    m_listModel.addModel(UserModel("user2", "9999"));
}

UserListModel.h

#pragma once
#include <QObject>
#include <QAbstractListModel>

struct UserModel {
    UserModel() {}
    UserModel(const QString name, const QString password) : name(name), password(password) {}
    QString name;
    QString password;
};

class UserListModel : public QAbstractListModel
{
    Q_OBJECT

public:
    explicit UserListModel(QObject* parent = 0);
    enum Roles { NameRole = Qt::UserRole, PasswordRole };
    int rowCount(const QModelIndex& parent = QModelIndex()) const override;
    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;
    void addModel(const UserModel model);

private:
    QList<UserModel> m_models;
};

UserListModel.cpp

#include "UserListModel.h"

UserListModel::UserListModel(QObject* parent) 
{
}

int UserListModel::rowCount(const QModelIndex& parent) const
{
    return m_models.count();
}

QVariant UserListModel::data(const QModelIndex& index, int role) const
{
    if (!index.isValid()) return QVariant();
    const UserModel user = m_models.at(index.row());
    if (role == NameRole) return user.name;
    else if (role == PasswordRole) return user.password;
    else return QVariant();
}

QHash<int, QByteArray> UserListModel::roleNames() const
{
    static QHash<int, QByteArray> mapping{ {NameRole, "name"}, {PasswordRole, "password"} };
    return mapping;
}

void UserListModel::addModel(const UserModel model)
{
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    m_models << model;
    endInsertRows();
}

对不起,如果这是初学者的错误,我才刚刚开始学习 qt 和 c++。

C++ Qt 删除函数

评论

3赞 Scheff's Cat 1/21/2023
你确定这是正确的吗?我敢打赌它必须(甚至)即返回引用而不是值。按值返回可能会触发复制构造函数的调用,该构造函数可能已被删除。这将解释您的错误消息。UserListModel getModel() { return m_listModel; }UserListModel& getModel() { return m_listModel; }const UserListModel& getModel() const { return m_listModel; }
1赞 drescherjm 1/21/2023
Qt 试图使复制任何 QObject 变得更加困难。相反,不应按值返回模型的副本或按值传递模型副本。
0赞 user2377283 1/23/2023
谢谢这解决了私有的问题:UserListModel2 m_listModel;Q_PROPERTY(UserListModel2* 模型 READ getModel);UserListModel2* getModel() { 返回 &m_listModel; }

答: 暂无答案