Qt拖放:启用复制时无法移动(Ubuntu Gnome)

时间:2012-07-04 03:14:24

标签: c++ qt ubuntu drag-and-drop gnome

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

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

有什么想法吗?我希望它像Nautilus(Gnome)或Windows文件资源管理器中的文件一样工作:拖动移动图标,按住Ctrl键并拖动它们。

3 个答案:

答案 0 :(得分: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;

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

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

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

答案 1 :(得分: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 
}` 

答案 2 :(得分:0)

这就是我要做的事情:

启用复制操作。然后听取drap& drop信号或覆盖虚拟方法(或任何Qt提供的,我没有检查),如果你想要的动作是移动,则“手动”删除行。下拉时,保存您喜欢的操作。

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

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