Seite 1 von 1

QSortFilterProxyModel + QTreeView: Falsche Werte

Verfasst: 29. Mai 2007 17:27
von law.skynet
hi,

ich habe hier mal zum testen und lernen eine kleine qt4 applikation geschrieben.

diese zeig mir daten einer sqlite db an. ich habe alles mit qtreeview gemacht. wenn ich dann einen datensatz anklicke werd dieser in labels angezeigt, das funktioniert auch alles ohne probleme. jetzt habe ich aber ein QSortFilterProxyModel damit ich die daten sortieren kann eingefügt. jetzt werden immer die flaschen daten angezeigt, wenn ich einen datensatz anklicke.

hier ist mein code:

Code: Alles auswählen

connect(itemView->selectionModel(), SIGNAL(clicked(const QModelIndex&)),
        SLOT(showMovieInfos(const QModelIndex&)));

Code: Alles auswählen

void MainWindow::showMovieInfos(const QModelIndex& index)
{

    QSqlRecord record = queryModel->record(itemView->currentIndex().row());
    movieTitleEdit->setText(record.value("title").toString());
    movieAuthorEdit->setText(record.value("author").toString());
    movieYearEdit->setText(record.value("year").toString());
}

Code: Alles auswählen

void MainWindow::refreshData()
{
    QSqlDatabase db = QSqlDatabase::database("dvdmanager");

    // debugging stuff
    /*
    QSqlQuery query("SELECT * FROM dvdmanager", db);
    QSqlRecord record = query.record();
    while (query.next()) {
        QString  name =
            query.value(record.indexOf("name")).toString();
        qDebug() << query.at() << ":" << name;
    }
    */

    queryModel = new QSqlQueryModel;
    queryModel->setQuery("SELECT title, author, year FROM dvdmanager", db);
    //remove id
    //queryModel->removeColumn(0);
    queryModel->setHeaderData(0, Qt::Horizontal, tr("Title"));
    queryModel->setHeaderData(1, Qt::Horizontal, tr("Author"));
    queryModel->setHeaderData(2, Qt::Horizontal, tr("Year"));


    proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(queryModel);

    //itemView->setModel(queryModel);
    itemView->setModel(proxyModel);
    itemView->setAlternatingRowColors(true);

    itemView->header()->setClickable(true);
    itemView->header()->setSortIndicator(0, Qt::AscendingOrder);
    itemView->header()->setSortIndicatorShown(true);
    itemView->setSortingEnabled(true);
    itemView->sortByColumn(0);
}
hat da jemand eine ahnung?

Verfasst: 29. Mai 2007 17:30
von Zandru
der index zeigt ins QSortFilterProxyModel und muss erst mit mapFromSource() umgewandelt werden.

Verfasst: 29. Mai 2007 17:34
von law.skynet
ich bin ein qt4 neuling kannst du mir das ein bisschen genauer erklären danke

Verfasst: 29. Mai 2007 17:55
von Zandru
was verstehst du denn nicht, nachdem du die Doku zu QSortFilterProxyModel::mapFromSource() gelesen hast?

Verfasst: 29. Mai 2007 18:04
von law.skynet
wo muss ich das mapFromSource einbauen?

wie gesagt bin totaler neuling :-)...

Verfasst: 29. Mai 2007 18:08
von Zandru
ich glaube eher du hast die doku nicht gelesen. :evil:

na seis drum, natürlich in MainWindow::showMovieInfos()

Verfasst: 29. Mai 2007 21:00
von law.skynet
doch ich habe die docu gelesen bzw. überflogen :-)

Code: Alles auswählen

void MainWindow::showMovieInfos(const QModelIndex& index)
{
    QModelIndex proxyIndex = proxyModel->mapFromSource(index);

    QSqlRecord record = queryModel->record(proxyIndex.row());
    movieTitleEdit->setText(record.value("title").toString());
    movieAuthorEdit->setText(record.value("author").toString());
    movieYearEdit->setText(record.value("year").toString());
}
funktioniert aber nicht....

Verfasst: 30. Mai 2007 11:33
von Zandru
sorry, es muss natürlich mapToSource() sein.

(du hast einen Proxy-Index und willst einen Index in das source-model)

Verfasst: 30. Mai 2007 12:00
von law.skynet
danke das war genau das problem :-)