0

我想知道如何QTableView通过拖动来改变行的顺序,并将顺序更改存储到模型中?

我使用 QTableView 作为视图,使用 QSqlTableModel 作为模型。我正在使用 Qt 5.15。

我设置:

ui->table_view->setSelectionMode(QAbstractItemView::SingleSelection);
ui->table_view->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->table_view->setEditTriggers(QAbstractItemView::NoEditTriggers);

我试过的方法:

1.

ui->table_view->setSectionsMovable(true);
ui->table_view->setDragEnabled(true);
ui->table_view->setDragDropMode(QAbstractItemView::InternalMove);
ui->table_view->setAcceptDrops(true);

它没有生效。该行无法拖动。

2.

ui->table_view->verticalHeader()->setSectionsMovable(true);
ui->table_view->verticalHeader()->setDragEnabled(true);
ui->table_view->verticalHeader()->setDragDropMode(QAbstractItemView::InternalMove);
ui->table_view->verticalHeader()->setAcceptDrops(true);

该行可以通过垂直标题拖动。但是更改的顺序不会影响模型。

4

1 回答 1

1

据我所知,QTableView 本身并不调用模型的 moveRows 方法。相反,拖放操作调用 *mimeData 方法。

因此,一种选择如下:

在您的模型中,您需要实现mimeDatadropMimeData功能。当您拖放一行时,视图将要求mimeData()给定行。如果您确定只需要内部移动,则可以将选定的行索引编码为QMimeData. 然后在dropMimeData()您解码选择的索引并使用它们来调用您的moveRows()实现。从此函数返回false以防止删除移出的行。

另一种选择是覆盖 QTableView 方法,例如直接dropEvent()调用模型moveRows()方法。

于 2021-06-23T16:17:02.293 回答