2015-05-25 84 views
1

實施QAbstractListModel時出現此錯誤。對QAbstractListModel的未定義引用:: postion

./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 *方法,所以在重建項目時出現錯誤。

之後,我添加開始*和結束*如文檔中所述。但是,當我建立這個項目時,我得到了上述錯誤。然後,我刪除插入和刪除方法,錯誤仍然存​​在。

我試圖刪除項目的構建目錄,清理,運行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 

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; 
} 
+0

我沒有在文檔中看到任何位置(...)函數? – Martin

+0

是的。我不知道爲什麼我有這個錯誤,或者這是IDE的錯誤?順便說一句,我使用QtCreator 3.3.1。 – iSa

+2

IDE不做鏈接,鏈接器。添加ObjectModel的代碼。在QAbstractListModel包含之前,你有任何奇怪的定義或typedefs嗎? –

回答

1

該簽名從錯誤信息相匹配的唯一QAbstractListModel類成員是QAbstractListModel::index

這肯定意味着在包含該類的2個頭文件或項目設置(.pro文件中的DEFINES += index=position)之前有一個#define index position

試着把#include <QAbstractListModel>先放在ObjectModel.h中。

你還應該檢查在QAbstractListModel類的Qt頭文件沒有被錯誤窗口中的搜索/替換(與原始類here比較)無意中修改。

+0

試圖先放入'#include '但沒有運氣。檢查了包含的所有頭文件和.pro文件,但沒有#define索引位置。 – iSa

+1

@iSa嘗試在'objectmodel.h'的開頭添加一行'#define index something',如果index實際上已定義,則gcc應該使用另一個定義的位置生成警告。如果沒有任何警告,你應該檢查'QAbstractListModel'類的Qt頭文件沒有被錯誤的窗口中的搜索/替換無意中修改(與原始類[here](http:// code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.h?h=5.4.2#n445))。 – alexisdm

+0

我已經檢查了位於'QtInstallFolder \ 5.4 \ mingw491_32 \ include \ QtCore'中的'qabstractitemmodel.h'文件。正如你所說的那樣,'QAbstractListModel :: index'正在被'QAbstractListModel :: position'取代。將它重命名爲'QAbstractListModel :: index'和「Thank You」,我能夠構建我的項目。 – iSa