Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Август 12, 2016, 14:51



Название: QAbstractItemModel & QTableView
Отправлено: demaker от Август 12, 2016, 14:51
Пытаюсь описать модель-таблицу.
Вот код
Код
C++ (Qt)
 
class TableModel : public QAbstractItemModel
{
   Q_OBJECT
public:
   explicit TableModel(QList<ElementModel *> *elements, QObject *parent = 0);
   virtual ~TableModel();
 
   int rowCount(const QModelIndex &parent) const;
   int columnCount(const QModelIndex &parent) const;
   QVariant data(const QModelIndex &index, int role) const;
   bool setData(const QModelIndex &index, const QVariant &value, int role);
   QVariant headerData(int section, Qt::Orientation orientation, int role) const;
   QModelIndex index(int row, int column, const QModelIndex &parent) const;
   QModelIndex parent(const QModelIndex &child) const;
 
   void setList(QList<ElementModel*> *);
 
private:
   QList<ElementModel*> *list;
 
   enum Column{
       SURNAME = 0,
       NAME,
       LAST
   };
 
};
 
TableModel::TableModel(QList<ElementModel *> *elements, QObject *parent) :
   QAbstractItemModel(parent)
{
   list = elements;
}
 
TableModel::~TableModel()
{
 
}
 
int TableModel::rowCount(const QModelIndex &parent) const
{
   Q_UNUSED(parent)
   return list->count();
}
int TableModel::columnCount(const QModelIndex &parent) const
{
   Q_UNUSED(parent);
   return LAST;
}
 
QVariant TableModel::data(const QModelIndex &index, int role) const
{
   if(!index.isValid() ||
      list->count() <= index.row() ||
      (role != Qt::DisplayRole && role != Qt::EditRole))
       return QVariant();
 
   switch(index.column()){
       case 0: return list->at(index.row())->surname;
       case 1: return list->at(index.row())->name;
   }
 
   return QVariant();
}
 
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
 
}
 
QModelIndex TableModel::parent(const QModelIndex &child) const
{
   return QModelIndex();
}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
   if(role != Qt::DisplayRole)
       return QVariant();
 
   if(orientation == Qt::Vertical)
       return section;
 
   switch(section){
       case SURNAME:
           return "Surname";
       case NAME:
           return "Name";
   }
   return QVariant();
}
 
QModelIndex TableModel::index(int row, int column, const QModelIndex &parent) const
{
   if(!hasIndex(row,column,parent))
       return QModelIndex();    
   return createIndex(row,column,parent.internalPointer());
}
 
void TableModel::setList(QList<ElementModel*> *elements)
{
   beginResetModel();
   list = elements;
   endResetModel();
}
 

Код
C++ (Qt)
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   ElementModel *one = new ElementModel();
   one->surname = "IVANOV";
   one->name = "IVAN";
 
   ElementModel *two = new ElementModel();
   two->surname = "PETROW";
   two->name = "PETR";
 
   QList<ElementModel*> list;
   list.append(one);
   list.append(two);
 
   tableModel = new TableModel(&list);
   ui->tableView->setModel(tableModel);
}
 

Код
C++ (Qt)
class ElementModel : public QObject
{
   Q_OBJECT
public:
   explicit ElementModel(QObject *parent = 0);
   virtual ~ElementModel();
 
public:
   QString surname;
   QString name;
};
 
Но таблица не заполняется???
Не могу понять почему???


Название: Re: QAbstractItemModel & QTableView
Отправлено: GreatSnake от Август 12, 2016, 15:47
Потому что нечего передавать в модель указатель на созданный на стеке объект.
По идее вообще падать должно после этого.

Совет:
реализуй хранилище и функции add()/get()/del() непосредственно в самой модели.


Название: Re: QAbstractItemModel & QTableView
Отправлено: demaker от Август 12, 2016, 16:05
Потому что нечего передавать в модель указатель на созданный на стеке объект.
По идее вообще падать должно после этого.

 :-[ ступил

Спасибо