QSortFilterProxyModel + QTreeView: Falsche Werte

Alles rund um die Programmierung mit Qt
Antworten
law.skynet
Beiträge: 32
Registriert: 17. April 2007 23:01

QSortFilterProxyModel + QTreeView: Falsche Werte

Beitrag 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?
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

der index zeigt ins QSortFilterProxyModel und muss erst mit mapFromSource() umgewandelt werden.
law.skynet
Beiträge: 32
Registriert: 17. April 2007 23:01

Beitrag von law.skynet »

ich bin ein qt4 neuling kannst du mir das ein bisschen genauer erklären danke
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

was verstehst du denn nicht, nachdem du die Doku zu QSortFilterProxyModel::mapFromSource() gelesen hast?
law.skynet
Beiträge: 32
Registriert: 17. April 2007 23:01

Beitrag von law.skynet »

wo muss ich das mapFromSource einbauen?

wie gesagt bin totaler neuling :-)...
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

ich glaube eher du hast die doku nicht gelesen. :evil:

na seis drum, natürlich in MainWindow::showMovieInfos()
law.skynet
Beiträge: 32
Registriert: 17. April 2007 23:01

Beitrag 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....
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

sorry, es muss natürlich mapToSource() sein.

(du hast einen Proxy-Index und willst einen Index in das source-model)
law.skynet
Beiträge: 32
Registriert: 17. April 2007 23:01

Beitrag von law.skynet »

danke das war genau das problem :-)
Antworten