2017-09-28 109 views
0

Qt開發人員跳過了這個非常重要的部分,真是太遺憾了...... 移動行(可能是選定的行)與檢查碰撞和支持選擇差距 - 現在人們必須自己實施它。如何在Qt中移動行(在QTableWidget中)

幸運的是,我花了幾乎整整一天創造這樣,自足功能,可以很容易地修改移動相關表格/列表什麼(目前移動選定的項目 - 第二行)。還有一個更有趣的部分,我能夠輕鬆地(大約3行)添加對方向參數的支持,而不是單獨的函數。

我還沒有想過,但一次移動超過1個項目也是可能的 - 雖然我沒有必要這樣做。

任何建議和錯誤測試讚賞~~享受

回答

0

該代碼(技術上很簡單)相當複雜,即使沒有檢查碰撞,間隙和表格結尾,所以我現在不打算解釋它,但如果這會引發興趣,我可能會遲一點。

另外,這段代碼是C++ 11,不知道需要重寫多少,才能在沒有更新的實現的情況下進行編譯,但只是一個頭。

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); 
} 

噢,和公正的可讀性,一個MVDIRECTION枚舉:

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