簡體   English   中英

如何在Qt中移動行(在QTableWidget中)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM