Russian Qt Forum

Qt => Model-View (MV) => Тема начата: proton от Октябрь 31, 2009, 18:39



Название: Обновление данных
Отправлено: 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();
}

Проблема в том, что ничего не меняется...


Название: Re: Обновление данных
Отправлено: Mikhail от Октябрь 31, 2009, 18:51
Попробуй посмотреть примеры Qt.
Используй setData вместо append


Название: Re: Обновление данных
Отправлено: MoPDoBoPoT от Октябрь 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;
   }
}
 


Название: Re: Обновление данных
Отправлено: proton от Октябрь 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;
   }
}
 
Большое спасибо, работает!