2013-02-19 5 views
1

Je viens de commencer à expérimenter avec AbstractListModel de Qt et comme une application pratique Im essayant de faire un modèle qui va stocker des objets personnalisés. Les classes sont testperson, personlistmodel classe et mainwindow. Le problème est que ma vue n'affiche pas les données correctes, si j'ajoute deux 'testperson' alors ma liste affiche deux lignes vides. Alors quelqu'un peut-il me guider s'il vous plaît sur la façon dont la mise en forme des données du modèle à voir fonctionne réellement ??? qu'est-ce que je fais mal maintenant ??QListView affichant des lignes vides ?? (Qt)

Personne Class.cpp

testPerson::testPerson(const QString &name, QObject *parent):QObject (parent) 
{ 
    this->fName = name; 
    connect(this,SIGNAL(pesonAdd()),this,SLOT(personConfirm())); 
    emit pesonAdd(); 
} 

void testPerson::setPerson(QString setTo) 
{ 
    fName = setTo; 
} 

QString testPerson::getPerson() const 
{ 
    return fName; 
} 


void testPerson::personConfirm() 
{ 
qDebug() << fName << QTime::currentTime().toString(); 
} 

PersonListModel.h

class personListModel : public QAbstractListModel 
{ 
    Q_OBJECT 

public: 
    explicit personListModel(QObject *parent = 0); 
    int rowCount(const QModelIndex &parent = QModelIndex()) const; 
    QVariant data(const QModelIndex &index, int role) const; 
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); 
    Qt::ItemFlags flags(const QModelIndex &index) const; 
    //Custom functions 
    void addPerson(testPerson &person); 
private: 
    QList<testPerson*> dataStore; 
}; 

PersonListModel.cpp

personListModel::personListModel(QObject *parent): QAbstractListModel (parent) 
{ 
} 

int personListModel::rowCount(const QModelIndex &parent) const 
{ 
    return dataStore.count(); 
} 

QVariant personListModel::data(const QModelIndex &index, int role) const 
{ 
    if(role != Qt::DisplayRole || role != Qt::EditRole){ 
    return QVariant(); 
    } 

    if(index.column() == 0 && index.row() < dataStore.count()){ 
    return QVariant(dataStore[index.row()]->getPerson()); 
    }else{ 
    return QVariant(); 
    } 

} 

bool personListModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    if (index.isValid() && role == Qt::EditRole) { 

    testPerson *item = dataStore[index.row()]; 
    item->setPerson(value.toString()); 

    dataStore.at(index.row())->setPerson(value.toString()); 
    emit dataChanged(index,index); 
    return true; 
} 
return false; 
} 

Qt::ItemFlags personListModel::flags(const QModelIndex &index) const 
{ 
    if(!index.isValid()){ 
    return Qt::ItemIsEnabled; 
    } 
    return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled; 
} 

void personListModel::addPerson(testPerson &person) 
{ 
    beginInsertRows(QModelIndex(),dataStore.count(), dataStore.count()); 
    dataStore.append(&person); 
    endInsertRows(); 
} 

Heres un code de test dans le mainwindow.cpp

// Inc needed files 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    //Test model 
    personListModel *model = new personListModel(this); 
    testPerson one("Adam Smith",this); 
    testPerson two("John Smith",this); 
    model->addPerson(one); 
    model->addPerson(two); 
    ui->listView->setModel(model); 
} 

Répondre

2

Si le code que vous avez fourni est correct, vous déclarez vos objets testPerson sur la pile, puis les stockez comme pointeurs dans le modèle. La chose surprenante est que cela ne provoque pas un accident.

+0

Le modèle stocke donc des pointeurs invalides? Puisque les objets 'testPerson' sont libérés quand ils sont hors de portée, et est-ce la raison pour laquelle ils montrent des lignes vides ... désolé donc ce n'est pas avec mes fonctions' personlistmodel' ?? – user1927602

+0

Je ne peux pas dire avec certitude, mais c'est la chose évidente que votre code d'échantillon fait mal. –