如何在Qt中向上移动选定的行



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

感谢您的回复瓦汉乔。我已经尝试使用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());

使用 Qt 文档进行QStandartItemModel - QStandardItemModel Class

  1. takeRow
  2. insertRow

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

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

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

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

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;
}

使用 SaZ 说的思想:

使用 Qt 文档进行QStandartItemModel - QStandardItemModel Class

  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);

我希望这对你有所帮助。

我认为这会有所帮助:

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 );
}

相关内容

  • 没有找到相关文章