Qt 对QAbstractListModel::postion的未定义引用

Qt 对QAbstractListModel::postion的未定义引用,qt,qt5.4,qabstractlistmodel,Qt,Qt5.4,Qabstractlistmodel,我在实现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 retu

我在实现
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*方法,因此在重建项目时出错

之后,我添加了文档中所述的开始*和结束*。但是,当我构建项目时,我得到了上面提到的错误。然后,我删除了insert和remove方法,错误仍然存在

我尝试删除项目的生成目录,清理、运行qmake,然后生成项目,但效果不佳。

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

唯一与错误消息中的签名匹配的
QAbstractListModel
类成员是
QAbstractListModel::index

这无疑意味着在该类的include之前的某个地方有一个
#define index position
,要么在2个头文件中,要么在项目设置中(
define+=index=position
在.pro文件中)

尝试将
#include
放在ObjectModel.h的第一位


您还应该检查
QAbstractListModel
类的Qt头文件是否被错误窗口中的搜索/替换无意中修改(与原始类相比)。

我在文档中没有看到任何位置(…)函数?是的。我不知道为什么会出现这个错误,或者这是IDE的一个bug?顺便说一句,我使用QtCreator 3.3.1.IDE不做链接,链接器做链接。添加ObjectModel的代码。在QAbstractListModel包含之前是否有任何奇怪的定义或typedef?我有一个来自MyObject头文件的typedef,它包含在ObjectModel头文件中
typedef QList MyObjectList
。将发布我的代码。@Martin,第二个,从未见过这样的。iSa,如果您使用Qt Creator,请确保删除正确的生成文件夹,如果在项目设置中选中了阴影生成,则可能会有所不同。尝试先放置
#include
,但没有成功。检查了包含的所有头文件和.pro文件,但没有
#定义索引位置
@iSa尝试在
objectmodel.h
的开头添加一行
#定义索引某物
,如果实际定义了索引,gcc应生成一条带有其他定义位置的警告。如果没有任何警告,您应该检查“QAbstractListModel”类的Qt头文件是否被错误窗口中的搜索/替换(与原始类相比)无意中修改。我已检查了位于
QtInstallFolder\5.4\mingw491\u 32\include\QtCore
中的
qabstractitemmodel.h
文件。正如您所说,
QAbstractListModel::index
正被
QAbstractListModel::position
所取代。将其重新命名为
QAbstractListModel::index
,然后“谢谢”,我就可以构建我的项目了。
#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;
}