对 QAbstractListModel::postion 的未定义引用
Undefined reference to QAbstractListModel::postion
我在实施 QAbstractListModel
时遇到此错误。
./debug\moc_ObjectModel.o:moc_ObjectModel.cpp:(.rdata$_ZTV12ObjectModel[__ZTV12ObjectModel]+0x38): undefined reference to `QAbstractListModel::position(int, int, QModelIndex const&) const'
collect2.exe: error: ld returned 1 exit status
在我向模型添加插入和删除方法之前,构建项目成功。
首先,我添加了insert和remove方法,但是忘记调用begin*和end*方法,所以重建项目的时候就报错了。
之后,我按照文档中的说明添加 begin* 和 end*。但是,当我构建项目时,出现上述错误。然后,我删除了插入和删除方法,错误仍然存在。
我试过删除项目的build目录,clean,运行qmake,然后build项目,但是还是不行
ObjectModel.h
#ifndef OBJECTMODEL_H
#define OBJECTMODEL_H
#include "ProjectCoreGlobal.h"
#include "Data/MyObject.h"
#include <QAbstractListModel>
class PROJECTCORESHARED_EXPORT ObjectModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit ObjectModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &position, int role) const Q_DECL_OVERRIDE;
// void insertObject(MyObject *object);
// void removeObject(int position);
MyObjectList objects() const;
MyObject *objectById(const int &id);
MyObject *objectByName(const QString &name);
private:
MyObjectList mObjects;
};
#endif // OBJECTMODEL_H
ObjectModel.cpp
#include "ObjectModel.h"
ObjectModel::ObjectModel(QObject *parent) :
QAbstractListModel(parent)
{
}
int ObjectModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
else
return mObjects.size();
}
QVariant ObjectModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
MyObject *obj = mObjects.at(index.row());
if (role == Qt::DisplayRole) {
return obj->name();
}
return QVariant();
}
// void ObjectModel::insertObject(MyObject *object)
// {
// beginInsertRows(QModelIndex(), mObjects.count(), mObjects.count());
// mObjects.append(object);
// endInsertRows();
// }
// void ObjectModel::removeObject(int position)
// {
// beginRemoveRows(QModelIndex(), position, position);
// mObjects.removeAt(position);
// endRemoveRows();
// }
MyObjectList ObjectModel::objects() const
{
return mObjects;
}
MyObject *ObjectModel::objectById(const int &id)
{
foreach (MyObject *obj, mObjects)
{
if (obj->id() == id)
{
return obj;
}
}
return NULL;
}
MyObject *ObjectModel::objectByNme(const QString &name)
{
foreach (MyObject *obj, mObjects)
{
if (obj->name() == name)
{
return object;
}
}
return NULL;
}
与错误消息中的签名匹配的唯一 QAbstractListModel
class 成员是 QAbstractListModel::index
。
这肯定意味着在包含 class 之前的某处有一个 #define index position
,或者在 2 个头文件中,或者在项目设置中(DEFINES += index=position
在.pro 文件)。
尝试将 #include <QAbstractListModel>
放在 ObjectModel.h 的第一位。
您还应检查 QAbstractListModel
class 的 Qt 头文件是否未被错误 window 中的 search/replace 无意中修改(与原 class here).
我在实施 QAbstractListModel
时遇到此错误。
./debug\moc_ObjectModel.o:moc_ObjectModel.cpp:(.rdata$_ZTV12ObjectModel[__ZTV12ObjectModel]+0x38): undefined reference to `QAbstractListModel::position(int, int, QModelIndex const&) const'
collect2.exe: error: ld returned 1 exit status
在我向模型添加插入和删除方法之前,构建项目成功。
首先,我添加了insert和remove方法,但是忘记调用begin*和end*方法,所以重建项目的时候就报错了。
之后,我按照文档中的说明添加 begin* 和 end*。但是,当我构建项目时,出现上述错误。然后,我删除了插入和删除方法,错误仍然存在。
我试过删除项目的build目录,clean,运行qmake,然后build项目,但是还是不行
ObjectModel.h
#ifndef OBJECTMODEL_H
#define OBJECTMODEL_H
#include "ProjectCoreGlobal.h"
#include "Data/MyObject.h"
#include <QAbstractListModel>
class PROJECTCORESHARED_EXPORT ObjectModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit ObjectModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &position, int role) const Q_DECL_OVERRIDE;
// void insertObject(MyObject *object);
// void removeObject(int position);
MyObjectList objects() const;
MyObject *objectById(const int &id);
MyObject *objectByName(const QString &name);
private:
MyObjectList mObjects;
};
#endif // OBJECTMODEL_H
ObjectModel.cpp
#include "ObjectModel.h"
ObjectModel::ObjectModel(QObject *parent) :
QAbstractListModel(parent)
{
}
int ObjectModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
else
return mObjects.size();
}
QVariant ObjectModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
MyObject *obj = mObjects.at(index.row());
if (role == Qt::DisplayRole) {
return obj->name();
}
return QVariant();
}
// void ObjectModel::insertObject(MyObject *object)
// {
// beginInsertRows(QModelIndex(), mObjects.count(), mObjects.count());
// mObjects.append(object);
// endInsertRows();
// }
// void ObjectModel::removeObject(int position)
// {
// beginRemoveRows(QModelIndex(), position, position);
// mObjects.removeAt(position);
// endRemoveRows();
// }
MyObjectList ObjectModel::objects() const
{
return mObjects;
}
MyObject *ObjectModel::objectById(const int &id)
{
foreach (MyObject *obj, mObjects)
{
if (obj->id() == id)
{
return obj;
}
}
return NULL;
}
MyObject *ObjectModel::objectByNme(const QString &name)
{
foreach (MyObject *obj, mObjects)
{
if (obj->name() == name)
{
return object;
}
}
return NULL;
}
与错误消息中的签名匹配的唯一 QAbstractListModel
class 成员是 QAbstractListModel::index
。
这肯定意味着在包含 class 之前的某处有一个 #define index position
,或者在 2 个头文件中,或者在项目设置中(DEFINES += index=position
在.pro 文件)。
尝试将 #include <QAbstractListModel>
放在 ObjectModel.h 的第一位。
您还应检查 QAbstractListModel
class 的 Qt 头文件是否未被错误 window 中的 search/replace 无意中修改(与原 class here).