Seite 1 von 1

TableView

Verfasst: 21. Mai 2015 18:50
von Boushar
Moin zusammen habe folgendes Problem / Fragestellung:
tableview.JPG
tableview.JPG (41.61 KiB) 5607 mal betrachtet
In diesem TableView kann ich die einzelnen Zellen doppelklicken und mein Programm bekommt die Daten in der Zelle zurückgegeben.

Code: Alles auswählen

void adminUserData::on_tableView_activated(const QModelIndex &index)
{
    QString val,val2;
   

    val = ui->tableView->model()->data(index).toString();
    
    
    QSqlQuery qry;
    qry.prepare("SELECT * FROM worker WHERE wo_id='"+val+"'");
    if (qry.exec())
    {
       while (qry.next())
       {
           ui->label_test->setText(qry.value(1).toString());          
           ui->label_test2->setText(qry.value(2).toString());
       }
    }
}
Ich möchte jedoch irgendeine zelle doppelklicken ( z.b. wo_forename) und dann die dazugehörige wo_id zurückgegeben bekommen, um dann eine SQL abfrage mit dem Primärkey machen zu können.
Habt ihr eine Idee?
MfG

Re: TableView

Verfasst: 21. Mai 2015 19:19
von veeman
Vielleicht so:

Code: Alles auswählen

QModelIndex first = ui->tableView->model()->index(index.row(), 0);

Re: TableView

Verfasst: 21. Mai 2015 19:50
von Boushar
danke

Re: TableView

Verfasst: 26. Mai 2015 15:41
von RHBaum
Besser:

Du bekommst bei fast allen Aktionen einen Modellindex als Position innerhalb der Table.
Statt damit einen weiteren lookup zu machen, kannst du dem ModelIndex Daten in Form eines sizeof(void *) grossen feldes mitgeben.
Das kann ein Zeiger auf Daten sein (achtung lifecycle beachten), oder halt ne ID in nen void* gecastet.

Du ueberschreibst ja die Modelindex funktionen, und benutzt dazu die createIndex() funktion vom AbstractItemModel.
Der Index funktion kannst den Zeiger als parameter befuellen und Voiala alle deine Verwendeten, ausgeworfen QModelIndizies haben den Wert (internalId oder internalPointer) auf den Wert gesetzt.
Also wenn du Bei allen ModelIndezies die ID einträgst, entsprechend Ihrer Row, kannst jedem ModellIndex sofort die zugehörige ID abfragen ....
Das ist die schnelle version.

Die elegante Version ....
Du benutzt die Data funktion wie Oben, nur rufst die am index auf (der leitet die eh ans model weiter).Du gibts Ihr einen Userdefinierten Wert für die Role, also Qt::UserRole + fixen Offset, schoen als Konstante definiert. Beispielsweisse Role_DBID.
Im Model musst ja die data methode implementieren, du bekommst über den Index ja die Row direkt, und kannst anhand dessen die ID in rausgeben, schoen als QVariant verpackt. Da kannst ID oder String reinpacken.
Wenns lustig bist kannst auch beides, aber dann mit unterschiedlicher Role ...

Das würde dir den Code verkürzen ...

Code: Alles auswählen

void adminUserData::on_tableView_activated(const QModelIndex &index)
{
    QString val,val2;
    
    qint32 DBId = index.data(Role_DBID).toInt();


    // val = ui->tableView->model()->data(index).toString();
    
    // hier die Abfrage mit der DB ID zusammenbauen. 
    ...
}
ist nicht unbedingt schneller, aber leichter lesbarer und besser erweiter bar ....
und anzeige und interne daten sind getrennt (du gehst nicht auf DisplayRole).

Ciao ....