我创建了QSortFilterProxyModel继承的自定义代理模型。我上面提到的代理模型的源模型也是QAbstractTableModel继承的自定义模型。然后,将我的自定义代理模型设置为QTableView。

在此自定义代理模型中,我重新实现了mimeData(..)函数。如下。

QMimeData* CustomProxyModel::mimeData( const QModelIndexList & rListIndexes ) const
{
    QMimeData *pMimeData = new QMimeData();

    //some code here

    connect(pMimeData, SIGNAL( destroyed(QObject*) ), this, SLOT( OnDestroyDraggedItem() ) );

    return pMimeData;
}


在Qt4.7中,用户将QTableView的某个项放到某个位置后不久,就调用了OnDestroyDraggedItem()插槽。换句话说,在拖放操作后不久将删除QMimeData对象。

但是在Qt 5.1中,从不调用OnDestroyDraggedItem()插槽。换句话说,在拖放操作之后,绝不会删除QMimeData对象。

难道我做错了什么?
还是Qt 5.1拖放操作后发生内存泄漏?
还有另一种方法可以找到拖放操作的终点吗?

最佳答案

也许为时已晚-但是您不能只继承QMimeData并在析构函数中执行某些操作吗?
当然应该是小的安全代码-在析构函数中引发异常会导致奇怪的行为:)

08-06 08:38