2017-09-28 1 views
0

Es ist wirklich eine Schande, dass Qt Entwickler diesen wirklich wichtigen Teil einer Tabelle übersprungen ... Zeilen verschieben (wahrscheinlich die ausgewählten) mit Prüfungen für Kollision und Unterstützung für Auswahlen mit Lücken - jetzt muss man es selbst umsetzen.Wie man Zeilen in Qt (in QTableWidget) verschiebt

Zum Glück habe ich so ziemlich den ganzen Tag die Schaffung einer solchen, in sich geschlossene Funktion, die leicht etwas geändert werden kann bewegen, um Tabellen/Listen bezogen (derzeit bewegt es ausgewählten Elemente - zweite Zeile). Und ein interessanterer Teil, ich konnte leicht (mit etwa 3 Zeilen mehr) Unterstützung für ein Richtungsargument anstelle einer separaten Funktion hinzufügen.

Ich habe nicht darüber nachgedacht, aber es könnte auch möglich sein, mehr als einen Gegenstand gleichzeitig zu bewegen - obwohl ich das nicht brauche.

Alle Vorschläge und Bug-Tests werden geschätzt ~~ enjoy.

Antwort

0

Der Code ist (technisch einfach) ziemlich komplex, auch ohne die Prüfung auf Kollision, Lücken und Tabellenenden, also werde ich es jetzt nicht erklären, aber ich könnte später, wenn das Interesse weckt.

Auch dieser Code ist C++ 11, nicht sicher, wie viel müsste neu geschrieben werden, um es ohne die neueren Implementierungen zu kompilieren, aber nur ein Kopf hoch.

void moveSelected(QTableWidget* _table, MVDIRECTION _dir) { 
    QList<QTableWidgetItem*> list = _table->selectedItems(); 

    if (list.count() == 0) { 
    perror("moveSelected(...) - no items supplied (NULL items)!\n"); 
    return; 
    } 
    if (_dir == Down) 
    std::reverse(list.begin(), list.end()); 

    int r_limit = (_dir == Up) ?0 :(_table->rowCount() - 1); 
    int r_last = list.first()->row() + _dir; 
    bool block = false; 

    QTableWidgetItem* buffer = NULL; 

    if (list.first()->row() != r_limit) 
    buffer = _table->takeItem(list.first()->row() + _dir, 0); 

    for (auto &item : list) { 
    if (item->row() != (r_last - _dir)) { 
     _table->setItem(r_last, 0, buffer); 
     buffer = _table->takeItem(item->row() + _dir, 0); 
     block = false; 
    } 

    r_last = item->row(); 

    if ((item->row() != r_limit) & (!block)) { 
     QTableWidgetItem* _item = _table->takeItem(item->row(), 0); 
     _table->setItem(r_last + _dir, 0, _item); 
    } 
    else if (!block) block = true; 
    } 

    if (buffer) _table->setItem(list.last()->row() - _dir, 0, buffer); 
} 

oh ja, und nur für die Lesbarkeit, ein MVDIRECTION Enum:

enum MVDIRECTION { 
    Up = -1, 
    Down = 0 
}; 
Verwandte Themen