TableView

Alles rund um die Programmierung mit Qt
Antworten
Boushar
Beiträge: 5
Registriert: 28. April 2015 14:04

TableView

Beitrag von Boushar »

Moin zusammen habe folgendes Problem / Fragestellung:
tableview.JPG
tableview.JPG (41.61 KiB) 4566 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
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: TableView

Beitrag von veeman »

Vielleicht so:

Code: Alles auswählen

QModelIndex first = ui->tableView->model()->index(index.row(), 0);
Boushar
Beiträge: 5
Registriert: 28. April 2015 14:04

Re: TableView

Beitrag von Boushar »

danke
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: TableView

Beitrag 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 ....
Antworten