Qt:区分来自同一窗口或其他窗口的拖动

时间:2013-12-11 22:26:17

标签: c++ qt qtableview qabstracttablemodel

我正在使用QTableView,我在其上设置了我自己的自定义模型,继承自QAbstractTableModel,使用对QTableView :: setModel()的调用。

表视图支持拖放:我的模型类重新实现mimeData()和dropMimeData()。即使在应用程序的两个实例之间,也可以拖放项目。

我想要实现的是:dropMimeData()应该检测被删除的元素是来自同一个窗口,还是来自另一个正在运行的应用程序副本的另一个窗口。并且它在每种情况下应该表现不同。

使用参数Qt :: DropAction动作dropMimeData()似乎是最自然的事情,但这不起作用:它始终是Qt :: CopyAction或Qt :: MoveAction,无论原始窗口如何,并且仅依赖于QTableView的defaultDropAction。

这可能吗?

2 个答案:

答案 0 :(得分:1)

假设QMainWindow实例MainWindow有两个QTableView实例作为childeren:
ui->tableView1ui->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。通过分析指针targetevent->source(),您可以找到它的位置和来源。

答案 1 :(得分:0)

我最终继承了QTableView的子类,可以在QT Designer中通过右键单击表单中的表并选择 Promote to ... 来完成 - 在我跟随的子类中adlag的建议并使用dropEvent->source()来检测源是同一个小部件还是另一个小部件。