首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QListView显示空白行??(Qt)

QListView显示空白行??(Qt)
EN

Stack Overflow用户
提问于 2013-02-19 23:51:09
回答 1查看 1.3K关注 0票数 1

我刚刚开始试验Qt的AbstractListModel,作为一个实践应用程序,我正在尝试制作一个模型,它将存储自定义的objects.The类是testpersonpersonlistmodel类和mainwindow。我的问题是我的视图没有显示正确的数据,如果我添加了两个‘testperson’,那么我的listView会显示两个空行。所以有人能指导我模型到视图的数据格式是如何实际工作的吗?我现在做错了什么??

Person Class.cpp

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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中的一些测试代码

代码语言:javascript
运行
复制
// 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);
}
EN

Stack Overflow用户

发布于 2013-02-20 00:11:19

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

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14961575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档