微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过拖动并存储对模型的更改来更改 QTableView 行的顺序?

如何解决如何通过拖动并存储对模型的更改来更改 QTableView 行的顺序?

我想知道如何通过拖动来改变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);

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

解决方法

据我所知,QTableView 不会自行调用模型的 moveRows 方法。而是拖放操作调用 *mimeData 方法。

因此,一种选择如下:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。