我正在使用QTableView,我在其上设置了我自己的自定义模型,继承自QAbstractTableModel,使用对QTableView :: setModel()的调用。
表视图支持拖放:我的模型类重新实现mimeData()和dropMimeData()。即使在应用程序的两个实例之间,也可以拖放项目。
我想要实现的是:dropMimeData()应该检测被删除的元素是来自同一个窗口,还是来自另一个正在运行的应用程序副本的另一个窗口。并且它在每种情况下应该表现不同。
使用参数Qt :: DropAction动作dropMimeData()似乎是最自然的事情,但这不起作用:它始终是Qt :: CopyAction或Qt :: MoveAction,无论原始窗口如何,并且仅依赖于QTableView的defaultDropAction。
这可能吗?
答案 0 :(得分:1)
假设QMainWindow实例MainWindow有两个QTableView实例作为childeren:
ui->tableView1
和ui->tableView2
如果尚未声明该功能,请将以下内容添加到mainwindow.h:
protected:
bool eventFilter(QObject *target, QEvent *event);
将以下内容添加到实现文件
中的构造函数中ui->tableView1->viewport()->installEventFilter(this);
ui->tableView2->viewport()->installEventFilter(this);
在实现文件mainwindow.cpp中添加以下函数 (如果该函数已经存在,则添加额外的块)
bool MainWindow::eventFilter(QObject * target, QEvent *event)
{
if (event->type() == QEvent::Drop) {
QDropEvent *dropEvent = (QDropEvent*) event;
// pointer target is the target and
// pointer dropEvent->source() is the source
if (target == ui->tableView1->viewport()) {
// ....
}
if (target == ui->tableView2->viewport()) {
// ...
}
}
return false; //leave further processing to widget
}
您还可以截取QDragMoveEvent
。通过分析指针target
和event->source()
,您可以找到它的位置和来源。
答案 1 :(得分:0)
我最终继承了QTableView
的子类,可以在QT Designer中通过右键单击表单中的表并选择 Promote to ... 来完成 - 在我跟随的子类中adlag的建议并使用dropEvent->source()
来检测源是同一个小部件还是另一个小部件。