C++ QListView显示空行??(Qt)

C++ QListView显示空行??(Qt),c++,qt,qlistview,qabstractlistmodel,C++,Qt,Qlistview,Qabstractlistmodel,我刚刚开始试验Qt的AbstractListModel,作为一个实践应用,我试图创建一个存储自定义对象的模型。这些类是testperson,personlistmodel类和mainwindow。我的问题是我的视图没有显示正确的数据,如果我添加了两个“testperson”,那么我的listView会显示两个空行。那么,有人能告诉我,要查看的模型的数据格式实际上是如何工作的吗???我现在做错了什么 Person Class.cpp testPerson::testPerson(const QSt

我刚刚开始试验Qt的AbstractListModel,作为一个实践应用,我试图创建一个存储自定义对象的模型。这些类是
testperson
personlistmodel
类和
mainwindow
。我的问题是我的视图没有显示正确的数据,如果我添加了两个“testperson”,那么我的listView会显示两个空行。那么,有人能告诉我,要查看的模型的数据格式实际上是如何工作的吗???我现在做错了什么

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

如果您提供的代码是正确的,那么您将在堆栈上声明
testPerson
对象,然后将它们存储为模型内的指针。令人惊讶的是,这并没有导致崩溃。

所以模型存储的是无效指针??由于
testPerson
对象在超出范围时被释放,这就是它显示空行的原因……很抱歉,这不是我的
personlistmodel
函数的原因??我不能确定,但很明显,您的示例代码做错了。
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::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();
}
// 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);
}