crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> как обнулить виджеты QDataWidgetMapper, когда модель отфильтровала 0 записей
Steklova Olga
  опции профиля:
сообщение 27.9.2011, 21:38
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Здравствуйте! Работаю с Qt 4.7, Firebird 2.1.
Подскажите, пожалуйста, новичку в Qt, как обнулить виджеты QDataWidgetMapper, когда фильтр модели изменился и модель QSqlTableModel отфильтровала 0 записей?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 28.9.2011, 10:51
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


mapper->setCurrentIndex(-1); //так не работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 28.9.2011, 12:50
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


void QDataWidgetMapper::clearMapping ()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 28.9.2011, 13:36
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


1. Заглянула в qdatawidgetmapper.cpp,
поняла, что mapper->setCurrentIndex(-1) и не должен работать.

2. Пока что, решила вручную обнулить виджеты:
    mapper->addMapping(lineEdit_1, 0);
    mapper->addMapping(lineEdit_2, 1);
    mapper->addMapping(lineEdit_3, 2);
    ...

void MainWindow_db::update_mapper()
{
    QModelIndex index = view->currentIndex();
    int cur_row = index.row();
    if (index.isValid()) {
        mapper->setCurrentIndex(cur_row);
    } else {
        //mapper->clearMapping(); //этот вариант не работает, как мне надо
        
        //обнуление виджетов вручную
        lineEdit_1->clear(); //предлагаемый мною вариант, кажется, работает как надо
        lineEdit_2->clear();
        lineEdit_3->clear();
    }
}

3.
Цитата
void QDataWidgetMapper::clearMapping ()

Этот вариант не работает, как мне надо,
так как текст в виджетах mapper'а при этом не обнуляется.

Мне кажется, что clearMapping только удаляет связь между mapper и виджетами lineEdit_i,
а мне эту связь терять не надо, просто фильтр у меня выдает либо 0 записей, либо > 0.

4. Кто-нибудь знает другой вариант?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 25.10.2011, 16:23
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Решение найдено ;)
Update mapper'а легко сделать, используя слот setCurrentModelIndex mapper'а:
bool MainWindow_db::create_mapper_card() 
{
    mapper_card = new QDataWidgetMapper(this);
    mapper_card->setModel(model_short);
    mapper_card->addMapping(lineEdit_card_1, 11);
    mapper_card->addMapping(lineEdit_card_2, 12);
    connect(view_short->selectionModel(),
            SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)),
            mapper_card, SLOT(setCurrentModelIndex(const QModelIndex &)));
    return true;
}

Если в модели установлен фильтр, то независимо от того, сколько отфильтровалось записей,
mapper обновится правильно (если 0 записей, то виджеты mapper'а обнулятся).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 28.12.2011, 14:36
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


В результате для моей программы понадобились оба найденных варианта:
и использование слота setCurrentModelIndex mapper'а, и обнуление виджетов mapper'а вручную. И вот почему.
У меня есть:
- model_parent с записями из главной таблицы (PK = F_ID),
- model_child с записями из дочерней таблицы (FK = F_TO_ID),
- view_parent (для модели model_parent) для отображения основных полей главной таблицы для всех ID (перемещаясь по нему, выбираем текущий ID),
- mapper_parent (для модели model_parent) для отображения остальных полей главной таблицы для текущего ID,
- mapper_child (для модели model_child) для отображения полей дочерней таблицы для текущего ID.
На модель model_parent накладываются различные фильтры, в результате чего она может отфильтровать 0 записей.

Решение:
    //для обновления mapper_parent 
    connect(view_parent->selectionModel(),
            SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)),
            mapper_parent, SLOT(setCurrentModelIndex(const QModelIndex &)));

    //для обновления mapper_child делаем по-другому,
    //потому что для mapper_child установлена не такая же модель, как для view_parent
    connect(view_parent->selectionModel(),
            SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)),
            this, SLOT(update_mapper_child()));
А в слоте update_mapper_child обнуляем виджеты mapper_child вручную,
если view_parent->currentIndex() стал невалидным (то есть, если в модели model_parent отфильтровалось 0 записей).

Сообщение отредактировал Steklova Olga - 28.12.2011, 14:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.11.2024, 15:27