1

Qt の AbstractListModel の実験を始めたばかりで、練習用アプリケーションとして、カスタム オブジェクトを格納するモデルを作成しようとしています。クラスはtestpersonpersonlistmodelクラス、およびmainwindow. 私が抱えている問題は、ビューに正しいデータが表示されないことです.2つの「testperson」を追加すると、listViewに2つの空の行が表示されます. では、表示するモデルのデータフォーマットが実際にどのように機能するかについて、誰かが私を案内してもらえますか??? 私は今何を間違っていますか??

人物クラス.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);
}
4

1 に答える 1

2

提供したコードが正しい場合は、testPersonオブジェクトをスタック上で宣言し、モデル内にポインターとして格納しています。驚くべきことは、これがクラッシュを引き起こしていないことです。

于 2013-02-19T16:11:19.067 に答える