gpt4 book ai didi

qt - 基类 'QAbstractListModel' 具有私有(private)复制构造函数

转载 作者:行者123 更新时间:2023-12-04 20:43:25 25 4
gpt4 key购买 nike

我有一个 QT QML 项目。 (仍然很小)

我首先在我的 UScenario 上绑定(bind)一个 ListView 。模型,通过子类 QAbstractListModel它工作得很好。

现在,每个 UScenarioUTask 的列表,其中也有 UCondition 的列表(所以,Utask 也是 QAbstractListModel 的子类)。但是,QT Creator 给了我一个错误:

Core/Tasks/utask.h:6: erreur : base class 'QAbstractListModel' has private copy constructor
class UTask: public QAbstractListModel
^

所以我不确定我的问题在哪里。我尝试阅读有关 QAbstractListModel 的文档对比 QAbstractItemModel ,但我不知道。

我还试着看看我是否曾经构建过 UTask以错误的方式;我想不是。
// USCENARIO.h
#ifndef USCENARIO_H
#define USCENARIO_H

#include <QAbstractListModel>
#include "../Tasks/utask.h"

class UScenario : public QAbstractListModel
{
Q_OBJECT

public slots:
void cppSlot() { // Used to test the insertion from UI
this->addTask(UTask());
}

public:
enum TaskRoles {
IdRole = Qt::UserRole + 1
};

UScenario(QObject *parent = 0);

private:
QList<UTask> m_tasks;

public:
void addTask(const UTask &task);
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role) const;
virtual QHash<int, QByteArray> roleNames() const;
};

#endif // USCENARIO_H



// USCENARIO.CPP

#include "uscenario.h"

UScenario::UScenario(QObject *parent)
: QAbstractListModel(parent)
{
}

void UScenario::addTask(const UTask &task)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_tasks.append(task);
endInsertRows();
}

int UScenario::rowCount(const QModelIndex & parent) const {
return m_tasks.count();
}

QVariant UScenario::data(const QModelIndex & index, int role) const {
if (index.row() < 0 || index.row() >= m_tasks.count())
return QVariant();

const UTask &task = m_tasks[index.row()];
if (role == IdRole)
return task.id();

return QVariant();
}

QHash<int, QByteArray> UScenario::roleNames() const {
QHash<int, QByteArray> roles;
roles[IdRole] = "id";
return roles;
}






// UTASK.H
#ifndef UTASK_H
#define UTASK_H
#include <QAbstractListModel>
#include "../Conditions/ucondition.h"

class UTask: public QAbstractListModel
{
Q_OBJECT

public:
enum TaskRoles {
typeRole = Qt::UserRole + 1
};

UTask(QObject *parent = 0);//:m_id(0){}
int id() const{return m_id;}

private:
int m_id;
QList<UCondition> m_conditions;

// QAbstractItemModel interface
public:
void addCondition(const UCondition &cond);
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role) const;
virtual QHash<int, QByteArray> roleNames() const;
};


#endif // UTASK_H







// UTASK.cpp
#include "utask.h"



UTask::UTask(QObject *parent):
QAbstractListModel(parent), m_id(0)
{

}

void UTask::addCondition(const UCondition &cond)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_conditions.append(cond);
endInsertRows();
}

int UTask::rowCount(const QModelIndex &parent) const
{
return m_conditions.count();

}

QVariant UTask::data(const QModelIndex &index, int role) const
{
if (index.row() < 0 || index.row() >= m_conditions.count())
return QVariant();

const UCondition &cond = m_conditions[index.row()];
if (role == typeRole)
return cond.type();

return QVariant();
}

QHash<int, QByteArray> UTask::roleNames() const
{
QHash<int, QByteArray> roles;
roles[typeRole] = "type";
return roles;
}


// MAIN
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include "../uCtrlCore/Scenario/uscenario.h"

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

UScenario scenarioModel;
scenarioModel.addTask(UTask());
scenarioModel.addTask(UTask());
scenarioModel.addTask(UTask());

QtQuick2ApplicationViewer viewer;
QQmlContext *ctxt = viewer.rootContext();
ctxt->setContextProperty("myScenarioModel", &scenarioModel);
viewer.setMainQmlFile(QStringLiteral("qml/uCtrlDesktopQml/main.qml"));

QObject *item = viewer.rootObject()->findChild<QObject*>("btn");
QObject::connect(item, SIGNAL(qmlSignal()), &scenarioModel, SLOT(cppSlot()));

viewer.showExpanded();

return app.exec();
}

最佳答案

问题在于您如何存储 UTask UScenario 中的对象类(class)

QList<UTask> m_tasks

简单来说,当您调用 m_tasks.append 时它正在尝试分配一个新的 UTask QList 中的对象通过复制源 UTask对象通过默认的复制构造函数。在 QAbstractListModel 的情况下它是私有(private)的。这就是您遇到错误的原因。

一个简单的解决方案是将存储类型更改为 UTask 的列表。指针, QList< UTask* >以及支持代码以在您的 UScenario 时正确释放内存对象被销毁。

例如,这里有一些但不是全部的变化,但应该为您指明正确的方向。只要确保更改 m_tasksQList< UTask* >第一的:
int main(int argc, char *argv[])
{
...

UScenario scenarioModel;
scenarioModel.addTask( new UTask() );
scenarioModel.addTask( new UTask() );
scenarioModel.addTask( new UTask() );

...

return app.exec();
}

void UScenario::cppSlot()
{
// Used to test the insertion from UI
this->addTask( new UTask() );
}

// Change the signature to take a pointer
void UScenario::addTask( UTask* task )
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_tasks.append(task);
endInsertRows();
}

// Make sure you define a destructor for UScenario
UScenario::~UScenario()
{
QList< UTask* >::iterator task = m_tasks.begin();

while( m_tasks.end() != task )
{
// Release the memory associated with the task.
delete (*task);
++task;
}

m_tasks.clear();
}

关于qt - 基类 'QAbstractListModel' 具有私有(private)复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22159251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com