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