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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper  (Прочитано 5020 раз)
VAP
Гость
« : Май 24, 2010, 11:22 »

Eсть QSqlTableModel, устанавливаю мапперу эту модель.
Код:
    sql_typeModel = new QSqlTableModel(this, db);
    sql_typeModel->setTable("table_tg");
    sql_typeModel->select();
    sql_typeModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
     
    dataMapper = new QDataWidgetMapper(this);
    dataMapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
    dataMapper->setModel(sql_typeModel);
    dataMapper->toFirst();
для отображения в QTreeView создал отдельно модель, для построения которой использована QSqlTableModel(выше).
Код:
    configTreeModel = new ConfigTreeModel(sql_typeModel, this);
    proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(configTreeModel); // прокси для фильтрации данных по колонке
отображаю во вьюхе
Код:
treeView->setModel(proxyModel);
treeView->setCurrentIndex(sql_typeModel->index(0, 0, QModelIndex()));
Пока не пришлось использовать QSortFilterProxyModel все работало нормально, а теперь возникла проблема - неправильно маппятся данные из модели дерева. Делаю так:
Код:
connect(treeView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)),
                                            this, SLOT(setMappingTreeView(QModelIndex)));

//-------------------------------------------------
void ConfigDialog::setMappingTreeView(const QModelIndex &index)
{
    QModelIndex proxyIndex;

    if (index.isValid()) {
        proxyIndex = proxyModel->mapToSource(index);
        if (proxyIndex.isValid()) {
            QSqlRecord record = sql_typeModel->record(proxyIndex.row());
            int id = record.value("id").toInt();
            dataMapper->setCurrentIndex(id);
        }
    }
}
Подскажите, кто знает, что делаю не так?
Записан
Kolobok
Гость
« Ответ #1 : Май 24, 2010, 12:41 »

Прочитай внимательно, что делает QDataWidgetMapper::setCurrentIndex( int index ) и что делаешь ты.
Записан
VAP
Гость
« Ответ #2 : Май 24, 2010, 13:39 »

Пытаюсь "засинхронизировать" индекс модели отображения с маппером. Проверил в слоте
setMappingTreeView(const QModelIndex &index) - "id" исходной модели выставляется правильно, а вот почему "косит" маппер не понятно.
Записан
Kolobok
Гость
« Ответ #3 : Май 24, 2010, 15:06 »

Я ведь написал, читай внимательно. В метод setCurrentIndex( int index ) должен передаваться номер строки или столбца. Данные из столбика "id" не имеют к этому абсолютно никакого отношения.
Записан
VAP
Гость
« Ответ #4 : Май 24, 2010, 15:49 »

У меня в исходной таблице номер строки  и есть тот самый "id" в первой колонке(насколько я понимаю). Или может быть иначе, поясни.
Записан
Kolobok
Гость
« Ответ #5 : Май 24, 2010, 16:35 »

"id" насколько я понимаю это primary key в таблице. По его значению невозможно вычислить номер строки. Таблица может быть отсортирована, строки из середины могут быть удалены или не попасть результирующий набор и т.д. Кроме того, индекс в базе обычно начинается с 1.
Записан
VAP
Гость
« Ответ #6 : Май 24, 2010, 16:53 »

Все разобрался, сделал вот так, и все заработало как надо:
Код:
void ConfigDialog::setMappingTreeView(const QModelIndex &index)
{
    QModelIndex proxyIndex;
   
    if (index.isValid()) {
        proxyIndex = proxyModel->mapToSource(index);
        if (proxyIndex.isValid()) {
            int idx = proxyIndex.row();
            dataMapper->setCurrentIndex(idx);
        }
    }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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