如何通过拖动和存储对模型的更改来更改 QTableView 行的顺序?
How to change the order of QTableView rows by dragging and store the changes to the model?
我想知道如何通过拖动更改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);
行可以垂直拖动header。但更改顺序不会影响模型。
据我所知,QTableView 本身不会调用模型的 moveRows 方法。而是拖放操作调用 *mimeData 方法。
因此,一种选择如下:
在您的模型中,您需要实现 mimeData
和 dropMimeData
函数。当您拖放一行时,视图将要求给定行的 mimeData()
。如果您确定只需要内部移动,您可以将选定的行索引编码为 QMimeData
。然后在 dropMimeData()
中解码所选索引并使用它们调用 moveRows()
实现。 Return false
从这个函数中防止删除移出的行。
另一种选择是以某种方式覆盖 QTableView 方法,例如 dropEvent()
,它直接调用模型 moveRows()
方法。
我想知道如何通过拖动更改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);
行可以垂直拖动header。但更改顺序不会影响模型。
据我所知,QTableView 本身不会调用模型的 moveRows 方法。而是拖放操作调用 *mimeData 方法。
因此,一种选择如下:
在您的模型中,您需要实现 mimeData
和 dropMimeData
函数。当您拖放一行时,视图将要求给定行的 mimeData()
。如果您确定只需要内部移动,您可以将选定的行索引编码为 QMimeData
。然后在 dropMimeData()
中解码所选索引并使用它们调用 moveRows()
实现。 Return false
从这个函数中防止删除移出的行。
另一种选择是以某种方式覆盖 QTableView 方法,例如 dropEvent()
,它直接调用模型 moveRows()
方法。