2013-09-09 8 views
3

У меня есть QTableView с 3 строками и 2 столбцами. (Здесь я использую QStandardItemModel). Я хочу, чтобы двигаться вверх/вниз по одиночной строке, когда нажата кнопка? Как я могу перемещать вверх/вниз строку в QTableView?Как перемещаться по выделенной строке в Qt

Спасибо за ваш ответ 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()); 

Спасибо за ваш ответ 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

Это не работает, потому что это виртуальная функция, которую вы должны реализовать самостоятельно. – neuronet

+1

нейронет, спасибо за ваш ответ. Итак, вы говорите, что эта функция ('moveRow()') ничего не делает, если вы не реализуете ее самостоятельно? , Итак, какова идея этой функции? –

ответ

3

Если вы используете Qt5 вы посмотрите на эту функцию можно:

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

«На моделях, которые поддерживают это, движется SourceColumn от sourceParent к destinationChild под destinationParent Возвращает true, если столбцы были успешно перемещены, иначе возвращает false. "

+1

abstractitemmodel, значит, вам все равно нужно реализовать его самостоятельно, не так ли? – neuronet

+0

@neuronet, да. Фактически, чтобы заставить 'moveRow()' работать, вам нужно реализовать 'QAbstractItemModel :: moveRows()' виртуальную функцию. – vahancho

4

Использование Qt документации для QStandartItemModel - QStandardItemModel Class

  1. takeRow
  2. insertRow
+0

Я согласен, 'QStandardItemModel' более удобен :) – Zaiborg

+0

Я отправил решение автору, но он удалил мой пост.Проблема заключалась в том, что TS не знал о литье типов, и он не мог отличать QModelIndex :: model() от QStandartItemModel. –

+0

@SaZ, который является TS, что вы имеете в виду, он удалил сообщение, он не может этого сделать с таким низким представителем? – neuronet

2

Вот короткая утилита я использую для перемещения Qt :: DisplayData из ряда в QAbstractItemModel:

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

Используя идею, что 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); 

Я надеюсь, что это поможет вам.