Seite 1 von 1

markieren von 3 spalten in QTableWidget

Verfasst: 5. Februar 2012 11:54
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

Re: markieren von 3 spalten in QTableWidget

Verfasst: 5. Februar 2012 12:06
von Christian81
Ein QTableWidget hat ein selectionModel() und dieses Model hat die Funktion QItemSelectionModel::select(). Damit kann man auch mehr als ein Item selektieren

Re: markieren von 3 spalten in QTableWidget

Verfasst: 5. Februar 2012 15:50
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);
    }
}

Re: markieren von 3 spalten in QTableWidget

Verfasst: 5. Februar 2012 16:06
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...

Re: markieren von 3 spalten in QTableWidget

Verfasst: 5. Februar 2012 16:35
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.