Russian Qt Forum

Qt => Model-View (MV) => Тема начата: limmenz от Апрель 04, 2009, 17:31



Название: Как обновить QTableView? (РЕШЕНО)
Отправлено: limmenz от Апрель 04, 2009, 17:31
Есть модель Worksmodel *worksmodel = new Worksmodel(&worklist);
И есть tableView->setModel(worksmodel);
Как после добавления нового элемента в worklist обновить QTableView? Пробовал tableView->update() - не помогает. Qt 4.5


Название: Re: Как обновить QTableView?
Отправлено: pastor от Апрель 04, 2009, 20:12
Что из себе представляет Worksmodel? Хотелось бы увидеть исходный код


Название: Re: Как обновить QTableView?
Отправлено: limmenz от Апрель 04, 2009, 20:28
worksmodel.h:
Код
C++ (Qt)
#ifndef WORKSMODEL_H
#define WORKSMODEL_H
#include <QAbstractTableModel>
#include <QList>
#include "work.h"
 
class Worksmodel : public QAbstractTableModel
{
public:
   Worksmodel(QList<Work> *worklist, QObject *parent = 0);
   int rowCount(const QModelIndex &parent) const;
   int columnCount(const QModelIndex &parent) const;
   QVariant data(const QModelIndex &index, int role) const;
   QVariant headerData(int section, Qt::Orientation orientation,int role) const;
   QList<Work> *worklist;
};
#endif

worksmodel.cpp:

Код
C++ (Qt)
#include "worksmodel.h"
#include <QList>
 
Worksmodel::Worksmodel(QList<Work> *worklist, QObject *parent) : QAbstractTableModel(parent)
{
   this->worklist = worklist;
}
 
int Worksmodel::rowCount(const QModelIndex & ) const
{
   return worklist->count();
}
 
int Worksmodel::columnCount(const QModelIndex & ) const
{
   return(5);
}
 
QVariant Worksmodel::data(const QModelIndex &index, int role) const
{
   if (!index.isValid())
       return QVariant();
 
   if (role == Qt::TextAlignmentRole) {
       return int(Qt::AlignLeft | Qt::AlignVCenter);
   } else if (role == Qt::DisplayRole) {
       switch (index.column())
       {
           case 0: {return worklist->at(index.row()).id; }
           case 1: {return worklist->at(index.row()).name; }
           case 2: {return worklist->at(index.row()).mh; }
           case 3: {return worklist->at(index.row()).md; }
           case 4: {
                   QString after;
                   if(!worklist->at(index.row()).after.isEmpty())
                   {
                       after = QString::number(worklist->at(index.row()).after[0]);
                       for(int i = 1; i < worklist->at(index.row()).after.count(); ++i)
                       {
                           after += ", "+QString::number(worklist->at(index.row()).after[i]);
                       }
                       return after;
                   }
                   return "0";
               }
       }
   }
   return QVariant();
}
 
QVariant Worksmodel::headerData(int section, Qt::Orientation  orientation ,int role) const
{
   if (role != Qt::DisplayRole)
       return QVariant();
   QStringList headers;
   headers << "#"
           << "Work's name"
           << "Man-hour"
           << "Man-day"
           << "Do after:";
   if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
   {
       return headers[section];
   }
   return QVariant();
}
 

Класс work:
Код
C++ (Qt)
class Work{ public:
    int id;
   QString name;
   double mh;
   double md;
   QList<int> after;
};


Название: Re: Как обновить QTableView?
Отправлено: UVV от Апрель 05, 2009, 08:20
А элемент добавляется как?
В модели не видно реализации функций insertRows() и removeRows().


Название: Re: Как обновить QTableView?
Отправлено: Пантер от Апрель 05, 2009, 09:28
worksmodel->reset();


Название: Re: Как обновить QTableView?
Отправлено: lit-uriy от Апрель 05, 2009, 10:34
reset() - не открытый метод


Название: Re: Как обновить QTableView?
Отправлено: Пантер от Апрель 05, 2009, 12:52
Его нужно вызывать в модели, для того чтобы вьюхи обновились.


Название: Re: Как обновить QTableView?
Отправлено: limmenz от Апрель 05, 2009, 13:07
Добавил в модель вот такую функцию:

Код
C++ (Qt)
void Worksmodel::needReset()
{
   this->reset();
}

И пытаюсь её вызвать в слоте класса главного окна MainWindow. Модель создаётся в конструкторе mainwindow.cpp: Worksmodel *worksmodel = new Worksmodel(&worklist). Как использовать её функцию needReset() в слотах mainwindow?


Название: Re: Как обновить QTableView?
Отправлено: limmenz от Апрель 08, 2009, 05:21
Разобрался. Вынес worksmodel в атрибуты класса mainwindow и при необходимости использую worksmodel->needReset()