3

私はQTableView3行2列のを持っています。(ここでは を使用していますQStandardItemModel)。QPushButton がクリックされたときに、1 行上に移動/下に移動したい。で行を上下に移動するにはどうすればよい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());
4

5 に答える 5

6

Qt ドキュメントを使用QStandartItemModel- QStandardItemModel クラス

  1. takeRow
  2. insertRow
于 2013-09-09T08:56:59.100 に答える
3

Qt5 を使用している場合は、次の関数を確認できます。

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

「これをサポートするモデルでは、sourceColumn を sourceParent から destinationParent の下の destinationChild に移動します。列が正常に移動された場合は true を返し、それ以外の場合は false を返します。」

于 2013-09-09T08:20:31.553 に答える
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;
}
于 2013-12-16T17:14:38.253 に答える
0

SaZが言ったアイデアを使用して:

Qt ドキュメントを使用QStandartItemModel- QStandardItemModel クラス

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

これがお役に立てば幸いです。

于 2015-09-04T19:55:47.453 に答える
-1

これが役立つと思います:

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 );
}
于 2015-05-24T08:55:59.107 に答える