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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление данных  (Прочитано 3025 раз)
proton
Гость
« : Октябрь 31, 2009, 18:39 »

Разбираюсь в MVC...

Создал простую форму с TableView, двумя LineEdit и кнопкой.

Также сделал простенькую модель:
Код:
#include <QAbstractTableModel>
#include <QVector>
#include <QString>

struct md
{
QString id;
QString text;
};

class mymodel : public QAbstractTableModel
{
public:
mymodel();
int rowCount(const QModelIndex & = QModelIndex()) const;
int columnCount(const QModelIndex & = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
//
void append(QString id, QString text);
private:
QVector<md> list;
};

mymodel::mymodel()
{}

int mymodel::rowCount(const QModelIndex &) const
{
return list.size();
}
int mymodel::columnCount(const QModelIndex &) const
{
return 2;
}

void mymodel::append(QString id, QString text)
{
md m;
m.id = id;
m.text = text;
list.append(m);
/*insertRow(list.size()-1);
for(int i=0; i<columnCount(); ++i)
{
QModelIndex ModelIndex = index(list.size()-1, i, QModelIndex());
emit dataChanged(ModelIndex, ModelIndex);
}*/
}

QVariant mymodel::data(const QModelIndex &index, int role) const
{
if(!index.isValid()) return QVariant();
if(role == Qt::DisplayRole)
{
switch (index.column())
{
case 0: return list[index.row()].id;
case 1: return list[index.row()].text;
default: return QVariant();
}
}
return QVariant();
}

По клику на кнопке добавляю данные:
Код:
void MainWindow::on_but_clicked()
{
model.append(ui->ed0->text(), ui->ed1->text());
//ui->tw->update();
}

Проблема в том, что ничего не меняется...
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Октябрь 31, 2009, 18:51 »

Попробуй посмотреть примеры Qt.
Используй setData вместо append
Записан
MoPDoBoPoT
Гость
« Ответ #2 : Октябрь 31, 2009, 19:21 »

Используй setData вместо append
Он хочет добавлять строку с данными, а не изменять их. Для этого надо переопределить метод insertRows() примерно так:
Код
C++ (Qt)
bool mymodel::insertRows(int row, int count/* = 1*/, const QModelIndex &parent/* = QModelIndex()*/)
{
   if ((count < 1) || (row < 0) || (row > list.size()))
       return false;
 
   beginInsertRows(QModelIndex(), row, row + count - 1);
   list.resize(list.size() + count);
   endInsertRows();
   return true;
}
 
а метод append() изменить на:
Код
C++ (Qt)
void mymodel::append(QString id, QString text)
{
   if (insertRow(list.size()) {
       list.last.id = id;
       ist.last.text = text;
   }
}
 
Записан
proton
Гость
« Ответ #3 : Октябрь 31, 2009, 19:41 »

Используй setData вместо append
Он хочет добавлять строку с данными, а не изменять их. Для этого надо переопределить метод insertRows() примерно так:
Код
C++ (Qt)
bool mymodel::insertRows(int row, int count/* = 1*/, const QModelIndex &parent/* = QModelIndex()*/)
{
   if ((count < 1) || (row < 0) || (row > list.size()))
       return false;
 
   beginInsertRows(QModelIndex(), row, row + count - 1);
   list.resize(list.size() + count);
   endInsertRows();
   return true;
}
 
а метод append() изменить на:
Код
C++ (Qt)
void mymodel::append(QString id, QString text)
{
   if (insertRow(list.size()) {
       list.last.id = id;
       ist.last.text = text;
   }
}
 
Большое спасибо, работает!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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