【问题标题】:How to Move Up a Selected Row in Qt如何在 Qt 中向上移动选定的行
【发布时间】:2013-09-09 08:14:31
【问题描述】:

我有一个QTableView,有 3 行 2 列。 (这里我使用的是QStandardItemModel)。单击 QPushButton 时,我想向上/向下移动一行。如何在QTableView 中向上/向下移动一行?

感谢您的回复 vahancho。我已经尝试过使用QAbstractItemModel::moveRow,但它不起作用:

   int currentRow = ui->tableView->currentIndex().row();
   QModelIndex sourceParent = ui->tableView->model()->index(ui->tableView->selectionModel()->currentIndex().row(),0);
   QModelIndex destinationParent = ui->tableView->model()->index(ui->tableView->selectionModel()->currentIndex().row()+1,0);
   ui->tableView->model()->moveRow(sourceParent,currentRow, destinationParent,destinationParent.row());

【问题讨论】:

  • 它不起作用,因为它是一个你必须自己实现的虚函数。
  • neuronet,谢谢您的回复。那么,你是说这个函数(moveRow())如果你自己不实现它就什么都不做? .那么这个函数的思路是什么?

标签: qt qt5 qtableview qt4.8 qstandarditemmodel


【解决方案1】:

使用QStandartItemModel - QStandardItemModel Class 的 Qt 文档

  1. takeRow
  2. insertRow

【讨论】:

  • 我同意,QStandardItemModel 更方便:)
  • 我向作者发布了解决方案,但他删除了我的帖子。问题是 TS 不知道类型转换,他无法将 QModelIndex::model() 转换为 QStandartItemModel。
  • @SaZ谁是TS,你是什么意思他删除了帖子,他不能以这么低的代表做吗?
  • TS == 主题启动器。他发布了一个答案,我发表了评论。所以他删除了他的答案,我的评论变得不可见。
【解决方案2】:

如果你使用 Qt5 可以看看这个函数:

bool QAbstractItemModel::moveRow(const QModelIndex & sourceParent, int sourceColumn, const QModelIndex & destinationParent, int destinationChild)

“在支持此功能的模型上,将 sourceColumn 从 sourceParent 移动到destinationParent 下的destinationChild。如果成功移动列,则返回true;否则返回false。”

【讨论】:

  • abstractitemmodel,也就是说还是需要自己实现吧?
  • @neuronet,是的。实际上,要让moveRow()工作,你需要实现QAbstractItemModel::moveRows()虚函数。
  • 奇怪的是这个虚函数是可用的,但是没有Qt类实现它。
【解决方案3】:

这是我用来移动 QAbstractItemModel 中一行的 Qt::DisplayData 的简短实用程序:

void CopyRowData( QAbstractItemModel * pModelDst, const QAbstractItemModel * pModelSrc, int nRowDst, int nRowSrc, const QModelIndex &parentDst /*= QModelIndex()*/, const QModelIndex &parentSrc /*= QModelIndex()*/, int nRole /*= Qt::DisplayRole*/ )
{
    if (parentSrc.isValid())
        assert(parentSrc.model() == pModelSrc);
    if (parentDst.isValid())
        assert(parentDst.model() == pModelDst);

    int nCols = pModelSrc->columnCount(parentSrc);

    for (int i = 0; i < nCols ; ++i)
        pModelDst->setData(pModelDst->index(nRowDst, i, parentDst), pModelSrc->index(nRowSrc, i, parentSrc).data(nRole), nRole);
}

bool MoveModelRows( QAbstractItemModel * pModel, int nSrcRow, int nDstRow, int nCount /*= 1*/, const QModelIndex &parent /*= QModelIndex()*/ )
{
    if (nSrcRow < 0 || nSrcRow >= pModel->rowCount(parent) ||
        nDstRow < 0 || nDstRow >= pModel->rowCount(parent))
        return false;

    if (nSrcRow == nDstRow)
        return true;

    int nDstRowNew = nSrcRow > nDstRow ? nDstRow : nDstRow + 1;

    if (!pModel->insertRows(nDstRowNew, nCount, parent))
        return false;

    int nSrcRowNew = nSrcRow > nDstRow ? nSrcRow + nCount : nSrcRow;

    for (int i = 0; i < nCount; ++i)
        CopyRowData(pModel, pModel, nDstRowNew + i, nSrcRowNew + i, parent, parent);

    pModel->removeRows(nSrcRowNew, nCount, parent);

    return true;
}

【讨论】:

    【解决方案4】:

    使用SaZ所说的想法:

    使用QStandartItemModel - QStandardItemModel Class 的 Qt 文档

    1. takeRow
    2. insertRow

    这是我为此目的编写的代码:

    QModelIndexList selection = ui->tableView->selectionModel()->selectedRows();
    int row = selection[0].row();
    QList<QStandardItem*> itemList = ui->tableView->model()->takeRow(row);
    ui->tableView->model()->insertRow(row-1,itemList);
    

    希望对你有所帮助。

    【讨论】:

      【解决方案5】:

      我认为这会有所帮助:

      for(int colId=0;colId<ui->tableWidget->columnCount();++colId)
      {
          QTableWidgetItem *item1=new QTableWidgetItem( *ui->tableWidget->item(id_row1,colId) );
          QTableWidgetItem *item2=new QTableWidgetItem( *ui->tableWidget->item(id_row2,colId) );
      
          ui->tableWidget->setItem(id_row1,colId, item2 );
          ui->tableWidget->setItem(id_row2,colId, item1 );
      }
      

      【讨论】:

      • 这会使用昂贵的堆分配创建不必要的副本。
      猜你喜欢
      • 2010-11-04
      • 2013-04-20
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多