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