Russian Qt Forum

Qt => Model-View (MV) => Тема начата: asket от Июнь 07, 2013, 08:49



Название: 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 и все заработало.