[英]How to move rows in Qt (in QTableWidget)
Qt開發人員跳過表的這一非常重要的部分真是太可惜了…… 移動行 (可能是選中的行 )以檢查沖突並支持帶有間隙的選擇-現在必須自己實現。
幸運的是,我整整一天花了很多時間來創建這樣一個自包含的函數 ,可以輕松對其進行修改以移動與表/列表相關的任何內容(當前它移動選定的項目 -第二行)。 還有一個更有趣的部分,我能夠輕松地(多出三行)添加對方向參數的支持,而不是添加單獨的函數。
我沒有考慮過,但是一次移動一個以上的項目也是可能的,盡管我不需要這樣做。
任何建議和錯誤測試都表示贊賞~~享受 。
該代碼(技術上很簡單)非常復雜,即使沒有檢查碰撞,間隙和表尾,因此我現在不打算對其進行解釋,但是稍后可能會引起興趣。
同樣,此代碼是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
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.