3

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

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

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

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

这可能吗?

4

2 回答 2

1

假设一个 QMainWindow 实例 MainWindow 有两个 QTableView 实例作为子项:
ui->tableView1ui->tableView2

如果该函数尚未声明,请将以下内容添加到 mainwindow.h:

protected:
bool eventFilter(QObject *target, QEvent *event);

将以下内容添加到实现文件中的构造函数中

ui->tableView1->viewport()->installEventFilter(this); 
ui->tableView2->viewport()->installEventFilter(this); 

在实现文件 mainwindow.cpp 中添加以下函数
(如果该函数已经存在,则添加额外的 if 块)

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()您可以找出它的去向和来源。

于 2015-08-04T18:58:29.023 回答
0

我结束了子类QTableView化,这可以在 QT Designer 中通过右键单击表单中的表并选择提升到... - 在子类中,我遵循了 adlag 的建议并用于dropEvent->source()检测源是同一个小部件还是另一个一。

于 2015-09-06T08:57:16.133 回答