2017-01-15 5 views
0

Я получаю эту ошибку:Создание QAbstractItemModel объекта из конструктора

/home/niko/QT_snippets/oop2/bus.cpp:3: error: no matching function for call to ‘Person::Person(Bus*, int)’ 
Bus::Bus(QObject *parent) : QObject(parent) , person1(this,100), person2(this,200) 
                       ^
/home/niko/QT_snippets/oop2/bus.h:5: In file included from ../oop2/bus.h:5:0, 
/home/niko/QT_snippets/oop2/bus.cpp:1: from ../oop2/bus.cpp:1: 
/home/niko/QT_snippets/oop2/person.h:11: candidate: Person::Person(QAbstractItemModel*, int) 
    explicit Person(QAbstractItemModel *parent = 0, int shoe_color=0); 
      ^
/home/niko/QT_snippets/oop2/person.h:11: note: no known conversion for argument 1 from ‘Bus*’ to ‘QAbstractItemModel*’ 

И мой вопрос, как я могу инициализировать объект, где члены имеют QAbstractModelItem класса? (Родитель person1 и person2 должен быть Bus, потому что, когда я его удаляю, я хочу, чтобы дети были удалены.) Я попытался применить к (QObject*), но я получил еще одну ошибку компиляции.

Это полный исходный код примера:

//File: bus.h 
#ifndef BUS_H 
#define BUS_H 

#include <QObject> 
#include "person.h" 

class Bus : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Bus(QObject *parent = 0); 

private: 
    Person  person1; 
    Person  person2; 
}; 

#endif // BUS_H 


//File: bus.cpp 
#include "bus.h" 

Bus::Bus(QObject *parent) : QObject(parent) , person1(this,100), person2(this,200) 
{ 

} 



//File: person.h 
#ifndef PERSON_H 
#define PERSON_H 

#include <QObject> 
#include <QAbstractItemModel> 

class Person : public QAbstractItemModel 
{ 
    Q_OBJECT 
public: 
    explicit Person(QAbstractItemModel *parent = 0, int shoe_color=0); 
    QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const; 
    QModelIndex parent(const QModelIndex &child) const; 
    int rowCount(const QModelIndex &parent = QModelIndex()) const; 
    int columnCount(const QModelIndex &parent = QModelIndex()) const; 
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 
private: 
    int m_shoe_color; 
}; 

#endif // PERSON_H 


//File: person.cpp 
#include "person.h" 

Person::Person(QAbstractItemModel *parent,int shoe_color) : QAbstractItemModel(parent) 
{ 
    m_shoe_color=shoe_color; 
} 
QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const { 

} 
QModelIndex parent(const QModelIndex &child) const { 

} 
int rowCount(const QModelIndex &parent = QModelIndex()) const { 

} 
int columnCount(const QModelIndex &parent = QModelIndex()) const { 

} 
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const { 

} 



//File: main.cpp 
#include <QCoreApplication> 
#include "person.h" 
#include "bus.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    Bus b; 
    return a.exec(); 
} 
+1

В этой строке: 'PERSON1 (это, 100)' 'вы передаете this' конструктору Человек, который является' Bus '. Но конструктор хочет, чтобы 'QAbstractItemModel' был родителем. Шина не является подклассом 'QAbstractItemModel', конечно, вы получите сообщение об ошибке. Либо сделайте Bus производным от QAbstractItemModel, либо измените конструктор Person на «явное лицо» (QObject * parent = 0, int shoe_color = 0), ' – lena

+0

@lena, правильно. вы можете ответить, что я приму это. – Nulik

ответ

1

В строке person1(this, 100) вы передаете this к Person конструктора и this в текущем контексте Bus. Но конструктор ожидает QAbstractItemModel в качестве родителя.

Поскольку шина не является подклассом QAbstractItemModel, вы получаете ошибки компилятора.

Чтобы сделать его работу или сделать автобус производное от QAbstractItemModel или изменить конструктор Person к explicit Person(QObject *parent = 0, int shoe_color=0);

Смежные вопросы