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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDataWidgetMapper  (Прочитано 3306 раз)
asket
Гость
« : Июнь 07, 2013, 08:49 »

Создал свою модель-наследника QAbstractTableModel, которую связал с GUI-виджетами с помошью QDataWidgetMapper, все работает, но при изменении данных в модели значения виджеты не меняются, как заставить QDataWidgetMapper обновить данные в виджетах при изменении данных в модели? Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июнь 07, 2013, 08:56 »

А модель все необходимые сигналы отправляет?
Записан
mutineer
Гость
« Ответ #2 : Июнь 07, 2013, 08:56 »

сигнал dataChanged высылаешь?
Записан
Bepec
Гость
« Ответ #3 : Июнь 07, 2013, 09:02 »

Как уже сказали выше - вы, при наследовании от модели скорее всего не посылаете необходимые сигналы при добавлении, удалении, изменении данных.
Записан
asket
Гость
« Ответ #4 : Июнь 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();

« Последнее редактирование: Июнь 07, 2013, 09:17 от asket » Записан
asket
Гость
« Ответ #5 : Июнь 07, 2013, 10:07 »

Решил проблему, хотя бился 3 дня, додуматься раньше не смог.
Причина по которой не обновлялось содержимое виджета заключается в том, что в функции модели data() указана только одна роль Qt::DisplayRole, я добавил туда Qt::EditRole и все заработало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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