【问题标题】:How to move rows in Qt (in QTableWidget)如何在 Qt 中移动行(在 QTableWidget 中)
【发布时间】:2018-03-10 13:00:52
【问题描述】:

Qt 开发人员跳过了表格中这个非常重要的部分真的很遗憾...移动行(可能是选定的行)检查碰撞并支持有间隙的选择 - 现在有自己实现。

幸运的是,我花了一整天的时间来创建这样的 自包含函数,可以轻松修改它以移动与表格/列表相关的任何内容(目前它移动 选定的项目 - 第二行)。还有一个更有趣的部分,我能够轻松地(大约多 3 行)添加对方向参数的支持,而不是单独的函数。

我还没有考虑过,但一次移动超过 1 个项目也是可能的 - 尽管我不需要这样做。

感谢任何建议和错误测试~~享受

【问题讨论】:

    标签: c++ qt c++11


    【解决方案1】:

    代码(技术上很简单)相当复杂,即使没有检查碰撞、间隙和表格结尾,所以我现在不打算解释它,但如果引起兴趣,我可能稍后再解释。

    另外,这段代码是 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
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多