1

实施时出现此错误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*。但是,当我构建项目时,我收到了上述错误。然后,我删除了插入和删除方法,错误仍然存​​在。

我曾尝试删除项目的构建目录,清理,运行qmake,然后构建项目,但它没有好。

对象模型.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

对象模型.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;
}
4

1 回答 1

1

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

这肯定意味着#define index position在该类的包含之前有一个地方,无论是在 2 个头文件中,还是在项目设置中(DEFINES += index=position在 .pro 文件中)。

尝试#include <QAbstractListModel>首先放入 ObjectModel.h。

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

于 2015-06-03T01:58:06.840 回答