Russian Qt Forum
Ноябрь 01, 2024, 07:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как обновить QTableView? (РЕШЕНО)  (Прочитано 19760 раз)
limmenz
Гость
« : Апрель 04, 2009, 17:31 »

Есть модель Worksmodel *worksmodel = new Worksmodel(&worklist);
И есть tableView->setModel(worksmodel);
Как после добавления нового элемента в worklist обновить QTableView? Пробовал tableView->update() - не помогает. Qt 4.5
« Последнее редактирование: Апрель 08, 2009, 05:23 от limmenz » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Апрель 04, 2009, 20:12 »

Что из себе представляет Worksmodel? Хотелось бы увидеть исходный код
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
limmenz
Гость
« Ответ #2 : Апрель 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;
};
Записан
UVV
Гость
« Ответ #3 : Апрель 05, 2009, 08:20 »

А элемент добавляется как?
В модели не видно реализации функций insertRows() и removeRows().
« Последнее редактирование: Апрель 05, 2009, 08:22 от UVV » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Апрель 05, 2009, 09:28 »

worksmodel->reset();
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Апрель 05, 2009, 10:34 »

reset() - не открытый метод
Записан

Юра.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Апрель 05, 2009, 12:52 »

Его нужно вызывать в модели, для того чтобы вьюхи обновились.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
limmenz
Гость
« Ответ #7 : Апрель 05, 2009, 13:07 »

Добавил в модель вот такую функцию:

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

И пытаюсь её вызвать в слоте класса главного окна MainWindow. Модель создаётся в конструкторе mainwindow.cpp: Worksmodel *worksmodel = new Worksmodel(&worklist). Как использовать её функцию needReset() в слотах mainwindow?
Записан
limmenz
Гость
« Ответ #8 : Апрель 08, 2009, 05:21 »

Разобрался. Вынес worksmodel в атрибуты класса mainwindow и при необходимости использую worksmodel->needReset()
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.177 секунд. Запросов: 23.