markieren von 3 spalten in QTableWidget

Alles rund um die Programmierung mit Qt
Antworten
woody
Beiträge: 85
Registriert: 1. April 2011 21:13

markieren von 3 spalten in QTableWidget

Beitrag von woody »

Hi ich habe eine kleine Frage:

Ich habe in einer Tabelle z.B neun Spalten. Wenn ich auf ein QTableWidgetItem klicke, das sich in Spalte 0 - 2 befindet,
sollen in dieser Reihe alle Items von 0 - 2 markiert werden. Klickt man jetzt noch(ctrl gedrückt) auf irgend ein Item, das sich in Spalte 6 - 9 befindet soll zusätzlich noch
Spalre 6 - 9 in der entsprechenden Reihe markiert werden.

Ich habe bereits eine Methode gefunden, wie ich das machen kann, aber dazu muss ich immer alles selektierten QModelIndexe in einer Schleife
durchmarschieren, was bei einer großen Selektion zu viel Zeit in anspruch nimmt...

danke
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: markieren von 3 spalten in QTableWidget

Beitrag von Christian81 »

Ein QTableWidget hat ein selectionModel() und dieses Model hat die Funktion QItemSelectionModel::select(). Damit kann man auch mehr als ein Item selektieren
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
woody
Beiträge: 85
Registriert: 1. April 2011 21:13

Re: markieren von 3 spalten in QTableWidget

Beitrag von woody »

danke für die Antwort.
Das ist mir klar, ich hab eine funktionierende Lösung gefunden, nur von der Performance her kann man diese Lösung vergessen, da bei einer größeren Selection
dieser Slot ewig dauert, da er immer wieder die ganzen selektierten QModelIndexes abarbeiten muss.

Code: Alles auswählen

Es geht um eine Tabelle mit 6 Spalten, die in 2 gedachte spalten, mit jeweils 3 spalten, geteilt wird und dann auch entsprechend selektiert werden soll. 
void MyTableWidget::sel_slot()
{
    qDebug() << "MyTableWidget::sel_slot() ausgelöst von signal: QTableWidget::itemSelectionChanged()";
    QModelIndexList midxes = this->selectedIndexes();
    for(int i = 0; i < midxes.size(); i++){

        int row_num = midxes.value(i).row();
        int col_num = midxes.value(i).column();

        int range1, range2;
        if(col_num <= 2){
            range1 = 0;
            range2 = 2;
        }
        else if(col_num <= 5){
            range1 = 3;
            range2 = 5;
        }

        QModelIndex topleft = indexFromItem(item(row_num,range1));
        QModelIndex bottomright = indexFromItem(item(row_num,range2));
        QItemSelectionModel* model = this->selectionModel();
        QItemSelection item_sel = model->selection();
        QItemSelection n_itemsel(topleft,bottomright);
        item_sel.merge(n_itemsel,QItemSelectionModel::Select);
        model->select(item_sel,QItemSelectionModel::Select);
    }
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: markieren von 3 spalten in QTableWidget

Beitrag von Christian81 »

Warum musst Du immer über alle Indices laufen? Es gibt doch genug Signale die einem sagen welche Items gerade (de)selektiert wurden. Damit kann man doch arbeiten...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
woody
Beiträge: 85
Registriert: 1. April 2011 21:13

Re: markieren von 3 spalten in QTableWidget

Beitrag von woody »

Ok danke, auf das hätt ich selber auch kommen können.

Jetzt benutze ich das selectionChanged(QItemSelection selected, QItemSelection deselected) Signal und arbeite mit den indexes() von selected, habe aber ein kleines Problem. Das Verhalten der Selection ist nämlich anders. Wenn ich jetzt zum Beispiel mit der Maus(durch gedrücktes ziehen) mehrere Items selektiere(ohne strg gedrückt) werden nur die einzelnen selektiert. Wenn ich strg gedrückt halte funktioniert es.
Antworten