Russian Qt Forum

Qt => Базы данных => Тема начата: VAP от Май 24, 2010, 11:22



Название: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: 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);
        }
    }
}
Подскажите, кто знает, что делаю не так?


Название: Re: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: Kolobok от Май 24, 2010, 12:41
Прочитай внимательно, что делает QDataWidgetMapper::setCurrentIndex( int index ) и что делаешь ты.


Название: Re: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: VAP от Май 24, 2010, 13:39
Пытаюсь "засинхронизировать" индекс модели отображения с маппером. Проверил в слоте
setMappingTreeView(const QModelIndex &index) - "id" исходной модели выставляется правильно, а вот почему "косит" маппер не понятно.


Название: Re: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: Kolobok от Май 24, 2010, 15:06
Я ведь написал, читай внимательно. В метод setCurrentIndex( int index ) должен передаваться номер строки или столбца. Данные из столбика "id" не имеют к этому абсолютно никакого отношения.


Название: Re: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: VAP от Май 24, 2010, 15:49
У меня в исходной таблице номер строки  и есть тот самый "id" в первой колонке(насколько я понимаю). Или может быть иначе, поясни.


Название: Re: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: Kolobok от Май 24, 2010, 16:35
"id" насколько я понимаю это primary key в таблице. По его значению невозможно вычислить номер строки. Таблица может быть отсортирована, строки из середины могут быть удалены или не попасть результирующий набор и т.д. Кроме того, индекс в базе обычно начинается с 1.


Название: Re: QSqlTableModel+QSortFilterProxyModel &QDataWidgetMapper
Отправлено: VAP от Май 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);
        }
    }
}