Название: QDataWidgetMapper
Отправлено: asket от Июнь 07, 2013, 08:49
Создал свою модель-наследника QAbstractTableModel, которую связал с GUI-виджетами с помошью QDataWidgetMapper, все работает, но при изменении данных в модели значения виджеты не меняются, как заставить QDataWidgetMapper обновить данные в виджетах при изменении данных в модели? Спасибо
Название: Re: QDataWidgetMapper
Отправлено: Old от Июнь 07, 2013, 08:56
А модель все необходимые сигналы отправляет?
Название: Re: QDataWidgetMapper
Отправлено: mutineer от Июнь 07, 2013, 08:56
сигнал dataChanged высылаешь?
Название: Re: QDataWidgetMapper
Отправлено: Bepec от Июнь 07, 2013, 09:02
Как уже сказали выше - вы, при наследовании от модели скорее всего не посылаете необходимые сигналы при добавлении, удалении, изменении данных.
Название: Re: QDataWidgetMapper
Отправлено: asket от Июнь 07, 2013, 09:14
вот тестовый класс-модель с одной строкой и тремя столбцами, на котором я экспериментирую с QDataWidgetMapper bool TableModel::setData( const QModelIndex &index, const QVariant &value, int role) { qDebug() << "setData" << index << value.toString() << role;
if (index.isValid() && role == Qt::EditRole) { switch(index.column()) { case 0: rec.name = value.toString(); break; case 1: rec.descr = value.toString(); break; case 2: rec.sum = value.toInt(); break; default: return false; }
// оповещаем об изменении данных emit(dataChanged(index, index));
// данные приняты return true; } return false; }
QVariant TableModel::data(const QModelIndex & index,int role) const { // выводим в консоль текущие значения параметров и считаем, сколько // раз вызывается метод TableModel::data и для каких ролей //qDebug() << "data" << index << role;
QVariant result; // if (role == Qt::BackgroundRole && index.column() == 0) // return QColor(255,255,204);
if (!index.isValid() || role != Qt::DisplayRole) return result;
switch (index.column()){ case 0: result = rec.name; qDebug() << "name: " << result; break; case 1: result = rec.descr; qDebug() << "descr: " << result; break; case 2: result = rec.sum; qDebug() << "sum" << result; break; }
return result; }
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const { Qt::ItemFlags result; if (!index.isValid()) return Qt::ItemIsEnabled;
result = QAbstractTableModel::flags(index); result |= Qt::ItemIsEditable;
return result; }
инициализация QDataWidgetMapper model = new TableModel(this);
widgetMapper = new QDataWidgetMapper(this); widgetMapper->setModel(model); widgetMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit); //ManualSubmit);
widgetMapper->addMapping(ui->lineEdit, 0, "text"); widgetMapper->addMapping(ui->lineEdit_2, 1, "text"); widgetMapper->addMapping(ui->spinBox, 2, "value"); widgetMapper->toFirst();
Название: Re: QDataWidgetMapper
Отправлено: asket от Июнь 07, 2013, 10:07
Решил проблему, хотя бился 3 дня, додуматься раньше не смог. Причина по которой не обновлялось содержимое виджета заключается в том, что в функции модели data() указана только одна роль Qt::DisplayRole, я добавил туда Qt::EditRole и все заработало.
|