2013-02-19 82 views
1

我刚开始尝试使用Qt的AbstractListModel,并且作为一个实践应用程序,我试图创建一个模型来存储自定义对象。类是testperson,personlistmodel类和mainwindow。我的问题是,我的视图不显示正确的数据,如果我添加两个'测试人员的,那么我的listView显示两个空行。那么有人可以请指导我如何模型的数据格式来查看实际工作?我现在做错了什么?QListView显示空白行? (Qt)

人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(); 
} 

赫雷什一些测试在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); 
} 
代码

回答

2

如果您所提供的代码是正确的,你是在栈上声明你testPerson对象,然后将它们存储在模型内部指针。令人惊讶的是,这不会导致崩溃。

+0

所以模型存储无效指针?由于'testPerson'对象在超出范围时被释放,所以它显示空行......对不起,这不符合我的'personlistmodel'函数?? – user1927602 2013-02-19 18:20:07

+0

我不能肯定地说,但这是你的示例代码做错了的显而易见的事情。 – 2013-02-20 09:30:38