我的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());
答案 0 :(得分:4)
使用QStandartItemModel
- QStandardItemModel Class
takeRow
insertRow
答案 1 :(得分:3)
如果您使用Qt5,您可以查看此功能:
bool QAbstractItemModel::moveRow(const QModelIndex & sourceParent, int sourceColumn, const QModelIndex & destinationParent, int destinationChild)
“在支持此功能的模型上,将sourceColumn从sourceParent移动到destinationParent下的destinationChild。如果成功移动了列,则返回true;否则返回false。”
答案 2 :(得分:2)
这是一个用于在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;
}
答案 3 :(得分:0)
我认为这会有所帮助:
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 );
}
答案 4 :(得分:0)
使用SaZ所说的想法:
使用
的Qt文档QStandartItemModel
- QStandardItemModel Class
takeRow
- 醇>
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);
我希望这对你有所帮助。