5

我正在实现一个视图和一个模型,我希望在其中支持在内部移动项目(通过拖动)和复制项目(通过在拖动时按 Ctrl)。我已经按照说明完成了我需要做的所有事情。我已经设置了 mime 函数,我已经实现了 removeRows() 和 flags()。问题是当我拖动时,它默认为复制操作(我得到带有加号的箭头光标,它确实通过在模型中创建一个新项目来复制项目)。

我能看到的唯一区别是:如果我在supportedDropActions() 中只返回Qt::MoveAction,它只会移动。如果我返回 (Qt::CopyAction | Qt::MoveAction),它只会复制。

有任何想法吗?我希望它像 Nautilus (Gnome) 或 Windows 文件资源管理器中的文件一样工作:拖动移动图标,ctrl+drag 复制它们。

4

3 回答 3

1

很抱歉,当我发现我做错了什么时,我没有回答这个问题。把我搞砸的代码在QAbstractItemView::startDrag()

if (d->defaultDropAction != Qt::IgnoreAction && (supportedActions & d->defaultDropAction))
        defaultDropAction = d->defaultDropAction;
    else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove)
        defaultDropAction = Qt::CopyAction;

问题是我没有在小部件上设置defaultDropAction属性,setDefaultDropAction( Qt::MoveAction ); 因此 startDrag() 默认为 CopyAction。如果 defaultDropAction 是 Qt::MoveAction,那么您可以使用键盘 Ctrl 将正在进行的拖动切换到复制操作,这是我想要的行为。

我喜欢 Qt,但肯定有很多与拖放相关的令人困惑且有些交织的属性。很容易得不到正确的属性组合。

底线:确保将defaultDropAction设置为Qt::MoveAction

于 2013-01-30T15:36:39.887 回答
0

这就是我要做的:

启用复制操作。然后收听拖放信号或覆盖虚拟方法(或任何 Qt 提供的,我没有检查),如果您的意思是移动,请“手动”删除该行。放下后,保存您喜欢的操作。

如果无法从 Qt 数据中确定所需的操作,请检查 Ctrl 键状态并保存一个布尔值,说明它是复制还是移动。现在,当 Qt 发出信号被删除时,检查您选择的操作,然后自己删除移动的行。

(我个人使用 gtkmm,copy-if-Ctrl-is-pressed 可以完美地工作)

于 2013-01-29T19:26:58.653 回答
0

如果您尝试这种方式会怎样首先编写一个keyPressEvent并设置是否按下ctrl键'

keyPressEvent(QKeyEvent *e)
    {
        if(e->key() == Qt::Key_Control)
            bControlKeyPressed = true;
    }
    keyReleaseEvent (QKeyEvent *e)
    {
       if(e->key() == Qt::Key_Control)
          bControlKeyPressed = false;
    }

并在鼠标按下事件中检查是否按下了 ctrl 键

`mousePressEvent()
{ 
  if (bControlKeyPressed) 
    //enable Qt::CopyAction 
else 
    //enable  Qt::MoveAction 
}` 
于 2013-01-29T07:03:24.483 回答